我正在使用 Windows 7 和 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 分钟不活动后设置屏幕保护程序时,它不起作用,自动监视器屏幕关闭也是如此。这就是我想要的,知道系统何时关闭屏幕或设置屏幕保护程序,带有后台监控程序。
我也尝试过将钩子事件与 extern dll 一起使用。我已经按照这个示例http://www.codeproject.com/Articles/1037/Hooks-and-DLLs在 CALLBACK msghook() 函数中添加了上面 WndProc 中相同的开关代码。即使使用 SendMessage,它也不起作用。
在这个问题困扰了几天之后,在互联网上搜索,论坛......我不知道我还能做什么。谁能帮我?