2013-05-05 152 views
2

我想捕捉屏幕保护程序事件。这是我的代码:捕捉屏幕保护程序事件

#include "stdafx.h" 
#include <iostream> 
#include "stdio.h" 

#include <Windows.h> 


HHOOK _hook; 

LRESULT CALLBACK HookCallback(int nCode, WPARAM wParam, LPARAM lParam) 
{ 
    if (nCode >= 0) 
    { 


     LPMSG msg = (LPMSG)lParam; 

     if(msg->message == WM_SYSCOMMAND) 
     { 
      if (msg->wParam == SC_SCREENSAVE) 
      { 
       std::cout<<"SC_SCREENSAVE\n"; 
      } 
     } 

    } 

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

void SetHook() 
{ 

    if (!(_hook = SetWindowsHookEx(WH_GETMESSAGE, HookCallback,NULL , 0))) 
    { 
     std::cout<<"Failed to install hook!\n"; 
    } 
} 

void ReleaseHook() 
{ 
    UnhookWindowsHookEx(_hook); 
} 


int _tmain(int argc, _TCHAR* argv[]) 
{ 

    SetHook(); 

    MSG msg; 
    while (GetMessage(&msg, NULL, 0, 0)) 
    { 

    } 

    ReleaseHook(); 

    return 0; 
} 

函数SetWindowsHookEx(WH_GETMESSAGE, HookCallback,NULL , 0)失败。它返回的代码:

错误1428:无法设置非挂钩没有模块句柄

。什么我做错了什么? 谢谢!

+1

Windows没有'GetLastError'函数(或类似的东西)来获取更多关于为什么以前的API调用失败的信息?你尝试过吗? – Mat 2013-05-05 11:54:37

+0

@Mat - 我会试试... – Sanich 2013-05-05 11:57:47

+0

这看起来只有一半的消息循环。 – Benj 2013-05-05 12:01:50

回答

0

全系统挂钩要求应用程序具有较高的访问权限。 您需要以管理员身份运行代码。

也许你会感兴趣this问题/答案。