2017-12-22 3 views
2

Guten Tag! Ich schreibe einen Windows-Dienst, der USB-Flash-Laufwerk erkennt und etwas mit dem angeschlossenen Laufwerk macht. Und jetzt nach den Tests muss ich Geräte nach dem Aufwachen aus dem Schlafmodus erneut verarbeiten. Ich löse dieses Problem, wenn der Dienst als Windows-Programm arbeitet. Zu lösen ich zusätzlich Prozess DBT_DEVNODES_CHANGED, aber Service diese Nachricht nicht erhalten, empfängt es nur DBT_DEVICE_ARRIVAL und DBT_DEVICEREMOVECOMPLETE. Ich versuchte auch, alle Nachrichten zu überprüfen, die durch Dienst außer SERVICE_CONTROL_DEVICEEVENT und SERVICE_CONTROL_STOP gehandhabt werden, wenn System in Schlaf geht und ich keine Nachricht bekomme.Wie kann ich den Ruhezustand im Windows-Dienst erkennen?

Wie kann ich feststellen, wann das System aufwacht?

Antwort

4

Eine normale Anwendung empfängt eine WM_POWERBROADCAST:PBT_APMRESUMEAUTOMATIC Fenstermeldung, aber ein Dienst wird diese Nachricht nicht erhalten, wenn es kein Fenster hat. Jedoch kann ein Dienst in seiner SERVICE_CONTROL_POWEREVENTHandlerEx Callback-Funktion erhalten, mit den gleichen Parametern wie WM_POWERBROADCAST

benachrichtigt einen Dienst des Systemstromereignisses. Der Parameter dwEventType enthält zusätzliche Informationen. Wenn dwEventType PBT_POWERSETTINGCHANGE ist, enthält der Parameter LpEventData auch zusätzliche Informationen.

Register Benachrichtigung zu erhalten, wenn das System ausgesetzt oder wiederaufgenommen:

auf Windows 8 und höher können Sie auch die PowerRegisterSuspendResumeNotification()-Funktion verwenden.

Der Service-Äquivalent von WM_DEVICECHANGE ist SERVICE_CONTROL_DEVICEEVENT:

benachrichtigt einen Dienst von Geräteereignissen. (Der Dienst muss registriert sein, um diese Benachrichtigungen über die Funktion RegisterDeviceNotification empfangen zu können.) Die Parameter dwEventType und lpEventData enthalten zusätzliche Informationen.

+0

Danke, ich verarbeite 'SERVICE_CONTROL_DEVICEEVENT'. Ich werde mehr Test am Montag, aber ich bekomme nicht 'SERVICE_CONTROL_POWEREVETN' und weiß nicht warum. – drem1lin

+0

Sie haben Recht, aber und ich und Sie vergessen eine Kleinigkeit. Es ist notwendig, 'SERVICE_ACCEPT_POWERBROADCAST' hinzuzufügen, um SetServiceStatus aufzurufen – drem1lin

0

Der beste Weg, um zu erkennen, dass das System aufwacht, sind Meldungen über die Prozessleistung. muss Windows verarbeiten WM_POWERBROADCAST Dienste SERVICE_ACCEPT_POWEREVENT zum letzten Aufruf SetServiceStatus müssen hinzufügen und SERVICE_CONTROL_POWEREVENT

Mein Fehler sehr dumm war verarbeiten. Ich vergesse, SERVICE_ACCEPT_POWEREVENT hinzuzufügen.

Verwandte Themen