首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何知道您的计算机已在屏幕保护程序或显示器/屏幕关闭了多少次?

如何知道您的计算机已在屏幕保护程序或显示器/屏幕关闭了多少次?
EN

Stack Overflow用户
提问于 2013-01-10 18:00:06
回答 1查看 1.4K关注 0票数 1

我使用的是Windows7和VC++。关键是要知道我的系统被设置成屏幕保护模式或显示器屏幕关闭的时间有多长。为了实现这一点,我尝试捕获事件WM_SYSCOMMAND和SC_SCREENSAVE,SC_MONITORPOWER。因此,我在Visual Studio2008中创建了一个Win32项目,并在WndProc函数中接收事件:

代码语言:javascript
复制
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函数),它只在我手动发送事件时才起作用:

代码语言:javascript
复制
SendMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_SCREENSAVE, (LPARAM)2);
or
SendMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, (LPARAM)2);

因此,当系统电源配置在2分钟不活动后设置屏幕保护程序时,它不起作用,自动监视器屏幕关闭时也是如此。这才是我真正想要的,知道系统何时关闭屏幕或设置屏幕保护程序,以及后台监控程序。

我还尝试在外部dll中使用钩子事件。我遵循了这个示例,http://www.codeproject.com/Articles/1037/Hooks-and-DLLs在回调msghook()函数中添加了上面用WndProc编写的开关代码。即使使用SendMessage,它也不能工作。

在这个问题上坚持了几天后,在互联网上搜索,论坛...我不知道我还能做什么。有谁可以帮我?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-11 19:32:45

我没有正确地使用钩子,但这种情况很少见。首先,关于setWindowsHookEx函数,我读到了必须使用WH_CALLWNDPROC或WH_SYSMSGFILTER来获取WM_SYSCOMMAND发送的消息,然后才能获取SC_SCREENSAVE wParam。在这种情况下,我不知道为什么,也许我错了,但这似乎不是真的。

在向SetWindowsHookEx发送了所有可能的消息后,我意识到WH_GETMESSAGE是唯一发送SC_SCREENSAVE wParam的人,至少在Windows7的钩子示例中是这样。

代码语言:javascript
复制
HHOOK hook;
HHOOK hook = SetWindowsHookEx(WH_GETMESSAGE,
                (HOOKPROC)msghook,
                hInst,
                0);

其次,监听钩子函数中捕获的每条消息,用LPMSG生成WM_SYSCOMMAND。我还读到wParam必须组合到0xFFF0才能进行比较。但是wParam & 0xFFF0 == SC_SCREENSAVE不工作,wParam == SC_SCREENSAVE也不工作。在这种情况下,唯一的方法是对WM_SYSCOMMAND和SC_SCREENSAVE使用LPMSG。

代码语言:javascript
复制
static LRESULT CALLBACK msghook(UINT code, WPARAM wParam, LPARAM lParam)
{
     if(code > 0)
     {
         CallNextHookEx(hook, code, wParam, lParam);
         return 0;
     }

     LPMSG msg = (LPMSG)lParam;

     if(msg->message == WM_SYSCOMMAND)
     {
        if (msg->wParam == SC_SCREENSAVE)
        {
           MessageBoxA(NULL,L"SC_SCREENSAVE",L"SC_SCREENSAVE",MB_OK);
        }

        if (msg->wParam  == SC_MONITORPOWER)
        {
           MessageBoxA(NULL,L"SC_MONITORPOWER",L"SC_MONITORPOWER",MB_OK);
        }
     }

     return CallNextHookEx(hook, nCode, wParam, lParam);
}

使用文件来测试事件是一个非常糟糕的想法,我认为使用MessageBox也好不到哪里去,但是我不知道如何正确地测试ir。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14255140

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档