2012-06-28 11 views
6

एक साधारण एप्लिकेशन बनाना, इसलिए जब उपयोगकर्ता विंडोज से लॉग आउट करता है, तो यह निश्चित रूप से एप्लिकेशन को बंद कर देता है। हम एक साधारण यूएसबी अलर्ट एप्लिकेशन बना रहे हैं जो उपयोगकर्ता कोWM_QUERYENDSESSION मुझे समस्याएं पैदा कर रहा है

लॉग इन कर रहा है, तो यूएसबी का पता लगाया गया है, तो एसटीओपीएस बंद हो रहा है। यह अब तक कोड है।

public Form1() 
    { 
     InitializeComponent(); 
    } 

    private static int WM_QUERYENDSESSION = 0x11; 
    private static bool systemShutdown = false; 
    protected override void WndProc(ref System.Windows.Forms.Message m) 
    { 
     if (m.Msg == WM_QUERYENDSESSION) 
     { 
      //MessageBox.Show("queryendsession: this is a logoff, shutdown, or reboot"); 
      systemShutdown = true; 
      m.Result = (IntPtr)0; 
     } 

     // If this is WM_QUERYENDSESSION, the closing event should be 
     // raised in the base WndProc. 
     m.Result = (IntPtr)0; 
     base.WndProc(ref m); 

    } //WndProc 

    private void Form1_FormClosing(object sender, FormClosingEventArgs e) 
    { 
     if (systemShutdown) 
     { 
      systemShutdown = false; 
      bool hasUSB = false; 

      foreach (DriveInfo Drive in DriveInfo.GetDrives()) 
      { 
       if (Drive.DriveType == DriveType.Removable) 
       { 
        hasUSB = true; 
       } 
      } 

      if (hasUSB) 
      { 
       e.Cancel = true; 
       MessageBox.Show("You still have USB device plugged in, please unplug it and log off again"); 
      } 
      else 
      { 
       e.Cancel = false; 
      } 
     } 
    } 

क्या हो रहा है विंडोज फोर्स कार्यक्रम से बाहर निकलें कि करने के लिए स्क्रीन प्रदर्शित किया जा रहा है, मैंने कहीं पढ़ा अगर आप 0 यह इस प्रदर्शित नहीं करता है WM_QUERYENDSESSION पर लौटने, लेकिन यह अभी भी इस प्रदर्शित कर रहा है ... है

कोई विचार?

संपादित करें:

हम कोड है कि किसी के साथ जवाब दिया करते थे, लेकिन हम अभी भी इस स्क्रीन हो रही है।

The screen we want to avoid!

+2

पहली जगह में एक अच्छा विचार को बंद करने से सिस्टम को रोक रहा है करने के लिए, कुछ भी नहीं किया गया है, लेकिन कोड काम करने के लिए लगता है धन्यवाद? –

+1

लेकिन हम एक प्रोग्राम बना रहे हैं, कि यदि किसी उपयोगकर्ता ने यूएसबी को प्लग किया है, तो वे इसे हटाए जाने तक बंद या बंद नहीं कर सकते हैं। – x06265616e

उत्तर

3

आप की कोशिश की

[DllImport("advapi32.dll", SetLastError=true)] 
static extern bool AbortSystemShutdown(string lpMachineName); 

बंद गर्भपात चाहिए।

+0

हमारे लिए काम नहीं करता है:/ – x06265616e

+0

यह काम करने के लिए प्रलेखित है, जैसा कि अन्य ने कहा है http://msdn.microsoft.com/en-us/library/aa376877%28VS.85%29.aspx ShutdownBlockReasonCreate() चाहिए भी काम करते हैं। विस्टा के साथ 0 का रिटर्न कोड स्पष्ट रूप से मर गया। – BugFinder

1

मैं इस अब ठीक काम कर रहा

 [DllImport("user32.dll", SetLastError = true)] 
    static extern int CancelShutdown(); 

में इस कोड को जोड़कर मिल गया मैं भी WM_QUERYENDSESSION = 0x11 से हैडर बदल दिया; WM_QUERYENDSESSION = 0x0011 पर;

सुनिश्चित नहीं हैं कि अगर यह सभी उत्तर