如何设置系统范围的挂钩来监听WM_DEVICECHANGE?

时间:2015-05-08 12:56:14

标签: c++ windows winapi hook

我想设置一个系统范围的挂钩来在C ++中监听WM_DEVICECHANGE。我知道使用SetWindowsHookEx()设置挂钩。我之前已经为键盘消息(WM_KEYUPWM_KEYDOWN)完成了此操作,但我想为WM_DEVICECHANGE执行此操作。我目前正在使用:

#include <windows.h>
#include <tchar.h>
#include <iostream>
void WinHook();
LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam);

int _tmain(int argc, _TCHAR* argv[])
{
   WinHook();
   std::cout << GetLastError() << " winhook\n";
   return 0;
}

void WinHook()
{
   HHOOK hook = NULL;
   hook = SetWindowsHookEx(WH_GETMESSAGE, HookProc, NULL, GetCurrentThreadId());
   std::cout << GetLastError() << " sethook\n";
   MSG msg;
   while (GetMessage(&msg, NULL, 0, 0) > 0)
   {
      TranslateMessage(&msg);
      DispatchMessage(&msg);
   }
}
LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam){
   std::cout << GetLastError() << " hookproc called\n";
   switch (wParam){
     case WM_DEVICECHANGE: std::cout << "SUCCESS!!!!!"; break;
     default: return CallNextHookEx(NULL, nCode, wParam, lParam);
   }
}

修改 GetLasterror()之后的SetWindowsHookEx()返回0,而函数HookProc()中的node_modules永远不会被调用。

2 个答案:

答案 0 :(得分:3)

您正在为自己的线程正在接收的所有邮件安装WindowsHook。

您的程序没有打开任何窗口,它没有收到任何消息。所以钩子不会被调用。

正如其中一条评论所说,你需要创建一个(可能是隐藏的)顶级窗口和RegisterDeviceNotification,你不需要一个钩子。

另一种方法是安装一个系统范围的挂钩,但这需要一个额外的DLL和桌面上的任何其他顶级窗口,它更复杂,更耗费资源。

答案 1 :(得分:1)

尝试使用钩子是错误的。

正确的方法是使用窗口来接收消息。如果您手头有一个窗口,也许是顶级窗口。或者只是一个消息窗口。顶级窗口将接收基本通知。或者使用RegisterDeviceNotification和仅限消息窗口来接收更全面的通知​​。