私はWindows7とVC++を使用しています。ビジネスは、システムがスクリーンセーバーモードまたはモニター画面オフに設定されている秒数を知ることです。これを実現するために、イベントWM_SYSCOMMANDおよびSC_SCREENSAVE、SC_MONITORPOWERをキャッチしようとしています。そのため、Visual Studio 2008でWin32プロジェクトを作成し、WndProc関数でイベントを受信しています。
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
switch (message)
{
case WM_SYSCOMMAND:
{
switch (LOWORD(wParam))
{
case SC_SCREENSAVE:
{
FILE *fl = fopen("this_is_a_event_test.txt","a");
fputs("SC_SCREENSAVE\n",fl);
fclose(fl);
}
break;
case SC_MONITORPOWER:
{
FILE *fl = fopen("this_is_a_event_test.txt","a");
fputs("SC_MONITORPOWER\n",fl);
fclose(fl);
}
break;
default:
{
}
}
}
break;
}
}
ダイアログがフォアグラウンドにある場合は正常に機能しますが、バックグラウンド(またはShowWindow関数にコメントする場合)では、イベントを手動で送信した場合にのみ機能します。
SendMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_SCREENSAVE, (LPARAM)2);
or
SendMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, (LPARAM)2);
そのため、システムの電源設定で2分間操作がないとスクリーンセーバーが設定された場合は機能しません。また、自動モニター画面がオフの場合も同様です。それが私が望んでいる本物です。システムがバックグラウンド監視プログラムを使用して、画面をオフにしているときやスクリーンセーバーを設定しているときを知ってください。
また、externdllでフックイベントを使用しようとしました。この例http://www.codeproject.com/Articles/1037/Hooks-and-DLLsに従って、CALLBACK msghook()関数に上記のWndProcと同じスイッチコードを追加しました。SendMessageを使用しても機能しません。
この問題に数日立ち往生した後、インターネットやフォーラムで検索しました...他に何ができるかわかりません。誰か助けてもらえますか?