ana*_*and 3 c++ winapi keyboard-hook
我创建了一个全局键盘钩子。
挂钩是在 DLL 中创建的。
#pragma comment(linker, "/SECTION:.SHARED,RWS")
#pragma data_seg(".SHARED")
static HHOOK hkb=NULL;
static CMyFile *pLF;
#pragma data_seg()
HINSTANCE hins = NULL;
extern "C"
LRESULT __declspec(dllexport) __stdcall CALLBACK KeyBoardHookProc(
int nCode,
WPARAM wParam,
LPARAM lParam)
{
if (nCode < 0) {
return CallNextHookEx(0, nCode, wParam, lParam);
}
return CallNextHookEx(hkb, nCode, wParam, lParam);
}
extern "C"
LRESULT __declspec(dllexport) __stdcall CALLBACK Install()
{
pLF = new CMyFile(L"c:\\1.txt");
hkb = SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyBoardHookProc,hins,0);
return 0;
}
extern "C"
BOOL __declspec(dllexport) __stdcall CALLBACK UnInstall()
{
return UnhookWindowsHookEx(hkb);
}
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch(ul_reason_for_call)
{
case DLL_PROCESS_ATTACH :
hins = (HINSTANCE) hModule;
break;
case DLL_THREAD_ATTACH :
break;
case DLL_THREAD_DETACH :
break;
case DLL_PROCESS_DETACH :
break;
}
return TRUE;
}
Run Code Online (Sandbox Code Playgroud)
我已经创建了一个加载这个 dll 并调用钩子 dll 的安装函数的 EXe。
HMODULE hMod = LoadLibrary(L"hk.dll");
if(hMod!=NULL)
{
typedef LRESULT (__stdcall CALLBACK *_installhk)() ;
_installhk installProc;
installProc = (_installhk) GetProcAddress(hMod,"Install");
if(installProc!=NULL)
{
installProc();
}
}
Run Code Online (Sandbox Code Playgroud)
当我启动 exe 时,KeyBoardHookProc 上的调试断点只被命中一次。
除非我关闭它,否则 exe 会继续运行,但如果我从键盘输入任何其他内容,则不会调用挂钩程序。
这可能是什么原因?
这不是设置全局键盘挂钩的正确方法吗?
您是如何测试未调用挂钩程序的?如果你试图用断点检查它,你必须注意你的钩子 dll 被加载到每个进程中,但你的断点只放在你当前的进程中。
如果您的应用程序中有任何窗口,请在敲击键之前关注它或使用日志对其进行调试。
另一种解决方案是使用不需要额外 DLL 的 WH_KEYBOARD_LL 挂钩。您可以直接从您的流程中挂钩。
| 归档时间: |
|
| 查看次数: |
4345 次 |
| 最近记录: |