2017-12-22 24 views
2

おはよう!私はUSBフラッシュドライブの接続を検出し、接続されたドライブで何かを行うWindowsサービスを書いています。そして、テストの後、私はスリープモードから目を覚ました後にデバイスを再処理する必要があります。サービスがWindowsプログラムとして動作するとき、私はこの問題を解決します。私はさらにDBT_DEVNODES_CHANGEDプロセスを解決するために、サービスはこのメッセージを受け取らず、DBT_DEVICE_ARRIVALDBT_DEVICEREMOVECOMPLETEしか受信しません。システムがスリープ状態になり、メッセージが表示されない場合は、SERVICE_CONTROL_DEVICEEVENTSERVICE_CONTROL_STOP以外のサービスで処理されるすべてのメッセージもチェックしようとしました。Windowsサービスでスリープモードから復帰する方法を検出するには?

システムがいつ起きているのかを判断するにはどうすればよいですか?

答えて

4

通常のアプリケーションではウィンドウメッセージが受信されますが、ウィンドウがない場合はこのメッセージが表示されません。ただし、サービスはWM_POWERBROADCAST

システムの電源イベントのサービスを通知と同じパラメータを使用して、そのHandlerExコールバック関数でSERVICE_CONTROL_POWEREVENTを受信することができます。 dwEventTypeパラメータには、追加情報が含まれています。 dwEventTypeがPBT_POWERSETTINGCHANGEの場合、lpEventDataパラメータには追加情報も含まれます。システムが一時停止または再開されたときに通知を受け取るために

レジスタ:

のWindows 8上で

以降では、あなたもPowerRegisterSuspendResumeNotification()機能を使用することができます。

WM_DEVICECHANGEのサービス当量SERVICE_CONTROL_DEVICEEVENTある:

は、デバイスイベントのサービスを通知します。 (サービスはRegisterDeviceNotification関数を使用してこれらの通知を受信するために登録されている必要があります)。dwEventTypeおよびlpEventDataパラメータには、追加情報が含まれています。

+0

ありがとう、私は 'SERVICE_CONTROL_DEVICEEVENT'を処理します。私は月曜日にもっとテストをするつもりですが、私は 'SERVICE_CONTROL_POWEREVETN'を得ておらず、理由はわかりません。 – drem1lin

+0

あなたは正しいですが、私はあなたに小さな事を忘れてしまいます。 SetServiceStatusを呼び出すには、 'SERVICE_ACCEPT_POWERBROADCAST'を追加する必要があります – drem1lin

0

システムを検出する最善の方法は、プロセスの電源メッセージです。 WindowsがWM_POWERBROADCAST サービスがSERVICE_ACCEPT_POWEREVENT私の誤差は非常に愚かだった

SERVICE_CONTROL_POWEREVENT SetServiceStatusへの最後の呼び出しに、プロセスを追加する必要があります処理しなければなりません。私は SERVICE_ACCEPT_POWEREVENTを追加することを忘れています。

関連する問題