【发布时间】:2015-05-08 12:56:13
【问题描述】:
我想设置一个系统范围的挂钩以在 C++ 中侦听 WM_DEVICECHANGE。我知道挂钩是使用SetWindowsHookEx() 设置的。我以前为键盘消息(WM_KEYUP,WM_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);
}
}
编辑:
在SetWindowsHookEx() 之后的GetLasterror() 返回0,而函数HookProc() 中的那个永远不会被调用。
【问题讨论】:
-
该消息被发送到所有顶级窗口,为什么要挂钩?您可以使用 RegisterDeviceNotification() 和隐藏窗口
-
@AlexK。我不想使用隐藏窗口,没必要。
-
如果有替代方案,我个人认为没有必要安装系统范围的钩子
-
您使用的是实际代码?我明白为什么它不适合你;如果它不能编译,它就不可能执行,如果它不能执行它就不可能捕捉到消息。如果您希望我们帮助您找出您的代码无法运行的原因,请发布您的实际代码,而不是您在编写问题时临时编造的内容。
-
@KenWhite 不是编的。主要方法我还没贴,就这样吧。