2008-11-21 14 views
8

मेरे पास एक ऐसा एप्लिकेशन है जो वर्तमान सत्र की खुली विंडो सूचीबद्ध कर सकता है। यह user32.dll से EnumWindows विधि का उपयोग करता है।मैं किसी अन्य उपयोगकर्ता सत्र की खुली विंडो (~ EnumWindows) की गणना कैसे कर सकता हूं

मैं इस कोड को विंडोज सेवा से चलाने के लिए चाहता हूं, लेकिन चूंकि सेवा किसी उपयोगकर्ता सत्र से जुड़ी नहीं है, तो यह स्पष्ट रूप से कुछ भी नहीं लौटाती है।

तो सवाल यह है कि, मैं किसी अन्य उपयोगकर्ता सत्र की खुली विंडो (उदाहरण के लिए एक विशिष्ट लॉगऑन उपयोगकर्ता के साथ) कैसे समझा सकता हूं?

इसी तरह EnumWindows के लिए, मैं भी उपयोगकर्ता सत्र की अग्रभूमि विंडो प्राप्त करना चाहता हूं (जैसे GetForegroundWindow वर्तमान उपयोगकर्ता के लिए काम करता है)।

उत्तर

5

जहां तक ​​मुझे पता है, आप दूसरे सत्र से एक सत्र की खिड़कियों तक नहीं पहुंच सकते हैं। यह ध्यान देने योग्य भी है कि वास्तव में "वर्तमान सत्र" जैसी कोई चीज़ नहीं है - टर्मिनल सेवाओं या एक्सपी के तेज़ उपयोगकर्ता स्विचिंग के माध्यम से कई उपयोगकर्ता लॉग ऑन हो सकते हैं।

इसके लिए एक दृष्टिकोण प्रत्येक उपयोगकर्ता की प्रोफ़ाइल में कोई यूआई नहीं होगा जो यूआई के साथ आपकी सेवा के साथ संवाद करेगा। आपको अभी भी इस तथ्य का सामना करना पड़ेगा कि हालांकि, कई सक्रिय सत्र हो सकते हैं।

+1

और, वास्तव में, कई कारणों से उन यूआई अनुप्रयोगों में सभी यूआई करना बेहतर होता है, जो उन्हें किसी प्रकार के आईपीसी के माध्यम से सेवा से नियंत्रित करते हैं। – atzz

5

this document के अनुसार आप CreateProcessAsUser का उपयोग कर किसी अन्य उपयोगकर्ता के लॉगऑन सत्र में एक प्रक्रिया बना सकते हैं, और वहां खिड़कियों की गणना कर सकते हैं। सेवा के साथ संवाद करने के लिए आपको अभी भी कुछ आईपीसी तंत्र की आवश्यकता होगी।

+0

चूंकि मुझे यह कॉल केवल एक बार करने की आवश्यकता नहीं है, लेकिन नियमित रूप से, मैं एक ऐसी सेवा के साथ समाप्त हो जाऊंगा जो प्रत्येक इंटरैक्टिव सत्र में उपयोगकर्ता-सत्र ऐप तुरंत शुरू करे। इसलिए मैं इस समाधान के साथ समाप्त हो जाऊंगा कि डेविडके/एटज़ ने सुझाव दिया था (एक सेवा की तरह छुपा ऐप)। लेकिन इसके बारे में जानना अच्छा है! धन्यवाद! ;) –

4

स्वीकृत उत्तर सही नहीं है।

तो सवाल यह है कि, मैं किसी अन्य उपयोगकर्ता सत्र की खुली खिड़कियों को कैसे समझा सकता हूं?

यदि आप स्थानीय सिस्टम खाते के रूप में चल रहे किसी सेवा के रूप में चल रहे हैं तो आप किसी भी सत्र की खुली विंडो का आकलन कर सकते हैं।

ऐसा करने के लिए पहले WTSEnumerateSessions के साथ सत्रों का आकलन करें। फिर EnumWindowStations के साथ प्रत्येक सत्र के अंदर विंडो स्टेशनों की गणना करें। फिर EnumDesktops के साथ प्रत्येक विंडो स्टेशन के लिए डेस्कटॉप का आकलन करें। अंत में आप उन डेस्कटॉपों में विंडोज़ को EnumWindows के साथ समझाएं।

(जैसे एक विशिष्ट लॉगऑन उपयोगकर्ता के साथ)

टर्मिनल सेवाओं या तेज़ उपयोगकर्ता स्विचिंग के माध्यम से उन पर लॉग कई समवर्ती हो सकते हैं।

इसी तरह एनमविंडोज़ के लिए, मैं भी उपयोगकर्ता सत्र की अग्रभूमि विंडो प्राप्त करना चाहता हूं (जैसे GetForegroundWindow वर्तमान उपयोगकर्ता के लिए काम करता है)।

यह सत्र, विंडो स्टेशन और डेस्कटॉप में एक पाए गए उपयोगकर्ता टोकन के साथ एक ऐप लॉन्च करके किया जा सकता है। वहां से आप GetForegroundWindow जैसे Win32 API को कॉल कर सकते हैं और जानकारी को अपनी मूल प्रक्रिया में वापस रिपोर्ट कर सकते हैं।

You can learn more about how Sessions, Window Stations, and Desktops work here

+0

यह काम नहीं करता है: EnumWindowStations हमेशा मौजूदा सत्र के लिए विंडो स्टेशनों का आकलन करता है। –

+0

@Roger: आप उन प्रक्रियाओं में से प्रत्येक में EnumWindowStations को कॉल करने से पहले प्रत्येक सत्र में एक प्रक्रिया शुरू करते हैं। –

+8

आप का उल्लेख है "यह एक ऐप लॉन्च करके किया जा सकता है ...", लेकिन मेरा मुद्दा यह है कि आप इसके बिना प्रत्येक सत्र के अंदर विंडो स्टेशनों को गणना नहीं कर सकते हैं। ऐसा करने के लिए आपको अपना सहायक ऐप लॉन्च करना होगा। तो: यदि आप उस उपयोगकर्ता के रूप में प्रक्रिया शुरू करने के लिए लोकलसिस्टम का लाभ उठाए बिना स्थानीय सिस्टम के रूप में - किसी भी सत्र की खुली खिड़कियों को गिनती नहीं कर सकते हैं ... "। यह चमकने के लिए एक कदम बहुत महत्वपूर्ण है। –

संबंधित मुद्दे

 संबंधित मुद्दे