2009-03-02 25 views
7

डुप्लीकेट:How can I programmatically determine if my workstation is locked?जाँच हो रही है

मैं कैसे पता लगा सकते हैं (रनटाइम के दौरान) एक विंडोज़ प्रयोक्ता अपने स्क्रीन (Windows + L) बंद कर दिया और इसे फिर से अनलॉक हो गया है जब। मुझे पता है कि मैं वैश्विक स्तर पर कुंजीपटल इनपुट ट्रैक कर सकता हूं, लेकिन क्या पर्यावरण की चर के साथ ऐसी चीज जांचना संभव है?

+0

इस प्रश्न का उत्तर आपके लिए एक प्रारंभिक बिंदु प्रदान कर सकता है। http://stackoverflow.com/questions/44980 –

+0

सभी के लिए धन्यवाद। आप हमेशा के रूप में बहुत उपयोगी थे :) –

उत्तर

3

आप इस सूचना को WM_WTSSESSION_CHANGE संदेश के माध्यम से प्राप्त कर सकते हैं। आपको विंडोज़ को सूचित करना होगा कि आप इन संदेशों को WTSRegisterSessionNotification के माध्यम से प्राप्त करना चाहते हैं और WTSUnRegisterSessionNotification के साथ पंजीकरण रद्द कर सकते हैं।

ये पोस्ट सी # कार्यान्वयन के लिए उपयोगी होनी चाहिए।

http://pinvoke.net/default.aspx/wtsapi32.WTSRegisterSessionNotification

http://blogs.msdn.com/shawnfa/archive/2005/05/17/418891.aspx

http://bytes.com/groups/net-c/276963-trapping-when-workstation-locked

+0

कुछ सेकंड्स द्वारा मुझे मारो :) – shahkalpesh

+0

-1: इसका प्रबंधित कोड संस्करण Win32 संस्करण से पहले पोस्ट किया गया था ... इसे सही उत्तर के रूप में क्यों चिह्नित किया गया है? – Powerlord

+0

शायद ही डाउनवोट के लिए एक कारण है, हे? –

15

SessionSwitch ईवेंट इसके लिए आपकी सबसे अच्छी शर्त हो सकती है। SessionSwitchReasonSessionSwitchEventArgs के माध्यम से यह पता लगाने के लिए जांचें कि यह किस प्रकार का स्विच है और उचित प्रतिक्रिया दें।

-2

आप बिल्कुल WM_WTSSESSION_CHANGE की जरूरत नहीं है बस आंतरिक WTTS APIs का उपयोग।

2

आप उन घटनाओं को प्राप्त करने के वैकल्पिक तरीके के रूप में ComponentDispatcher का उपयोग कर सकते हैं।

यहां लपेटने के लिए एक उदाहरण वर्ग है।

public class Win32Session 
{ 
    private const int NOTIFY_FOR_THIS_SESSION = 0; 
    private const int WM_WTSSESSION_CHANGE = 0x2b1; 
    private const int WTS_SESSION_LOCK = 0x7; 
    private const int WTS_SESSION_UNLOCK = 0x8; 

    public event EventHandler MachineLocked; 
    public event EventHandler MachineUnlocked; 

    public Win32Session() 
    { 
     ComponentDispatcher.ThreadFilterMessage += ComponentDispatcher_ThreadFilterMessage; 
    } 

    void ComponentDispatcher_ThreadFilterMessage(ref MSG msg, ref bool handled) 
    { 
     if (msg.message == WM_WTSSESSION_CHANGE) 
     { 
      int value = msg.wParam.ToInt32(); 
      if (value == WTS_SESSION_LOCK) 
      { 
       OnMachineLocked(EventArgs.Empty); 
      } 
      else if (value == WTS_SESSION_UNLOCK) 
      { 
       OnMachineUnlocked(EventArgs.Empty); 
      } 
     } 
    } 

    protected virtual void OnMachineLocked(EventArgs e) 
    { 
     EventHandler temp = MachineLocked; 
     if (temp != null) 
     { 
      temp(this, e); 
     } 
    } 

    protected virtual void OnMachineUnlocked(EventArgs e) 
    { 
     EventHandler temp = MachineUnlocked; 
     if (temp != null) 
     { 
      temp(this, e); 
     } 
    } 
} 
संबंधित मुद्दे