2009-05-05 5 views
1

meine Anwendung läuft in C#, mit framework.fr von Drittanbietern funktioniert als eine Benutzeroberfläche für viele application.my Frage ist, wenn meine appplication ausgeführt wird und das System nicht Standby/hybernate OS Operationen passieren sollte. Irgendwie muss ich das Event für Standby/hybernate von OS abbrechen. Bitte helfen Sie mir in dieser Hinsicht.Wie kann ich Standby und Ruhezustand abbrechen?

Dank Sun

+0

Ich empfehle Ihnen, den Benutzer manuell die Energieeinstellungen zu setzen. Wir hatten Leute, die Daten verloren haben und am nächsten Tag keinen Computer mehr auf dem Sprung hatten, als eine Anwendung plötzlich dachte, ihre Lebensdauer sei so wichtig, dass sie über Nacht die Batterie vollständig entleerte. Wenn es sogar die kleinste Möglichkeit gibt, dass jemand das Schließen der Anwendung vergisst/ignoriert, ist es sehr wichtig, dass Sie den Gefallen nicht zurückgeben, indem Sie den Computer nutzlos machen. –

Antwort

1

Es gibt keine Möglichkeit, das Ereignis aus .NET abzubrechen. Sie müssen dies mit P/Invoke und der Win32-API tun, indem Sie WM_POWERBROADCAST bearbeiten und BROADCAST_QUERY_DENY zurückgeben. Werfen Sie einen Blick auf this CodeGuru page für einen Stoß in die richtige Richtung.

Von Interesse wäre auch this page, Detaillierung einiger Ereignisse, die in. NET ausgelöst werden, wenn ein Benutzer abmeldet oder suspend/Hibernates.

+0

hallo lc i Benutzer die follwing Code protected override void WndProc (ref System.Windows.Forms.Message m) .... m.Result = new IntPtr ((int) WindowMessage.BROADCAST_QUERY_DENY); .... return Dies funktioniert, wenn ich den Code in sekundären Fenster verwenden (in meiner app sekundär sind Fenster, die # Fenster C) sind die primären Fenster meine die Daten aus Backend bekam verwenden erstellt application.i haben Verwenden Sie diese Methode in orimary Fenster Teil. Ich muss in einer Datei verwenden, in der 'wndproc' Methode nicht erlaubt ist. keine Idee danke So –

+0

Ich bin mir nicht sicher, ich 100% folgen Sie mit primären und sekundären Fenstern, aber jedes "Fenster" (Windows.Forms.Form) sollte eine Nachrichtenschleife und daher eine WndProc Callback haben. Setzen Sie den Code in der Form, in der Sie Application.Run() 'ed haben. Alles andere schlägt fehl, Sie können eine kleine versteckte Form machen, die dort sitzt und auf diese Nachricht wartet. –

+0

Hallo danke für Ihre Antwort ich werde es kurz setzen die Fenster werden in das Framework gezeichnet bedeutet das Framework wird zuerst starten wir haben keine Kontrolle über das Framework. der Rahmen hat Menüs, enthält den Namen der Anwendung, klicken Sie auf eine beliebige paricular Menü entsprechende App wird gesendet, um die Fenster zu zeichnen sent sent alle Details notwendig, um die Fenster zu zeichnen.nun unsere Arbeit beginnen, analysieren die Details und zeichnen das Fenster in der Rahmen. –

4

Diese blog post beschreibt, wie verhindert werden kann, dass ein PC unter Verwendung von in den Ruhezustand versetzt wird. Der Code sieht wie folgt aus:

public partial class Window1 : Window 
{ 
    private uint m_previousExecutionState; 

    public Window1() 
    { 
     InitializeComponent(); 

     // Set new state to prevent system sleep (note: still allows screen saver) 
     m_previousExecutionState = NativeMethods.SetThreadExecutionState(
      NativeMethods.ES_CONTINUOUS | NativeMethods.ES_SYSTEM_REQUIRED); 
     if (0 == m_previousExecutionState) 
     { 
      MessageBox.Show("Call to SetThreadExecutionState failed unexpectedly.", 
       Title, MessageBoxButton.OK, MessageBoxImage.Error); 
      // No way to recover; fail gracefully 
      Close(); 
     } 
    } 

    protected override void OnClosed(System.EventArgs e) 
    { 
     base.OnClosed(e); 

     // Restore previous state 
     if (0 == NativeMethods.SetThreadExecutionState(m_previousExecutionState)) 
     { 
      // No way to recover; already exiting 
     } 
    } 
} 

internal static class NativeMethods 
{ 
    // Import SetThreadExecutionState Win32 API and necessary flags 
    [DllImport("kernel32.dll")] 
    public static extern uint SetThreadExecutionState(uint esFlags); 
    public const uint ES_CONTINUOUS = 0x80000000; 
    public const uint ES_SYSTEM_REQUIRED = 0x00000001; 
} 

Wenn Sie die Anwendung in der Post beschrieben mögen, gibt es eine aktualisierte Version here.

0

Powercfg und shutdown (vor allem shutdown /a, um eine Systemabschaltung abzubrechen) könnte möglicherweise nützlich sein.

Verwandte Themen