裸分求:关于dll中钩子键盘本程序的问题!!小弟有一需求 是这样的:只要用户在软件中按下ctrl+F5就弹出一个快
裸分求:关于dll中钩子键盘本程序的问题!!
小弟有一需求 是这样的:只要用户在软件中按下ctrl+F5就弹出一个快捷键帮助窗口。
这个软件在启动时会加载小弟的dll文件,但是没有给小弟传线程id,所以小弟只能用
GetCurrentThreadId()这个函数 但是没有效果。
如下:
C/C++ codeCAsaApp::CAsaApp(){ InstallHook();}void CAsaApp::InstallHook(){ hOk = ::SetWindowsHookEx(WH_KEYBOARD, KeyProc, theApp.m_hInstance, GetCurrentThreadId()); if (hOk == NULL) ///////////////////////////////这个钩子安装成功 但是没有效果}
这个是我在dll初始化的时候调用的 这个能提示成功 但是没有效果
hOk = ::SetWindowsHookEx(WH_KEYBOARD, KeyProc, theApp.m_hInstance, 0);
就不能成功,hOk = NULL 也不知道为什么 小弟刚上班,这些还不太懂 请教!!!
[解决办法]hOk = ::SetWindowsHookEx(WH_KEYBOARD, KeyProc, NULL, GetCurrentThreadId());
[解决办法]hOk = ::SetWindowsHookEx(WH_KEYBOARD, KeyProc, NULL, GetCurrentThreadId());
这样安装的话,钩子究竟是安装不成功还是没有效果?如果是没有效果的话,那说明那个软件的界面部分与加载你的DLL的那段代码不在同一个线程,因此GetCurrentThreadId没有获得界面线程的ID。
如果你能获得那个软件的窗口句柄(你打算在哪个窗口里响应Ctrl+F5,你就用哪个窗口的句柄),那么你可以通过GetWindowThreadProcessId来获取它的线程ID。
[解决办法]GetCurrentThreadId()得到的是当前的线程ID,这个和你要钩的线程是不是一个线程啊?
[解决办法]把钩子写在当前模块中的方法仅适合于在本进程内部安装钩子。此时SetWindowsHookEx的第三个参数必须是NULL,而第四个参数则是想要安装钩子的线程(必须是本进程内的线程)。
如果要钩其它进程(比如记事本)中的消息,你的钩子必须写在一个独立的DLL文件中,并且安装钩子的时候,必须用LoadLibrary所返回的hModule作为SetWindowsHookEx的第三个参数,GetProcAddress所返回的值作为第二个参数,然后第四个参数设为0。例如:
HOOKPROC hkprcSysMsg;
static HINSTANCE hinstDLL;
static HHOOK hhookSysMsg;
hinstDLL = LoadLibrary((LPCTSTR) "c:\\windows\\sysmsg.dll");
hkprcSysMsg = (HOOKPROC)GetProcAddress(hinstDLL, "SysMessageProc");
hhookSysMsg = SetWindowsHookEx(WH_SYSMSGFILTER,hkprcSysMsg,hinstDLL,0);
[解决办法][解决办法]如果是本进程的话。没有必要使用hook,PreTranslateMsg就可以