【发布时间】:2012-12-13 16:52:27
【问题描述】:
好吧,我尝试了不同的解决方案来解决我的问题,但它不起作用。
我调用 SetWindowsHookExA,然后当我按下一个键时,消息框不显示。怎么办?
这是我的代码(这是一个由程序加载的另一个 DLL 加载的 DLL):
#include <Windows.h>
HINSTANCE gl_hThisInstance = NULL;
HHOOK hHook = NULL;
LRESULT CALLBACK KeyHit(int code,WPARAM wParam,LPARAM lParam);
BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
gl_hThisInstance = (HINSTANCE)hModule;
hHook = SetWindowsHookExA(
WH_KEYBOARD,
KeyHit,
//(HWND)gl_hThisInstance//not working
0,//not working
//(DWORD)gl_hThisInstance//not working
//GetCurrentThreadId()//even not working with this
0//not working
);
break;
}
return TRUE;
}
LRESULT CALLBACK KeyHit(int code,WPARAM wParam,LPARAM lParam)
{
MessageBox(0,"PRESSED","PRESSED",0);
return CallNextHookEx(hHook,code,wParam,lParam);
}
【问题讨论】:
-
为什么要投到 HOOKPROC?如果编译器没有默默地做这个转换,那么 KeyHit 的签名是错误的。
-
我删除了(HOOKPROC),它编译得很好,所以我认为这不是问题
-
你为什么要投射
gl_hThisInstance>它已经是正确的类型了... -
当你说“
(DWORD)gl_hThisInstance//not working”是什么意思? -
还有first parameter to DllMain is
HINSTANCE,所以也没有理由投那个。
标签: c++ winapi hook keyboard-hook