gpt4 book ai didi

c++ - SetWindowsHookEx 没有调用我的回调?

转载 作者:太空宇宙 更新时间:2023-11-04 12:01:43 26 4
gpt4 key购买 nike

好吧,我尝试了不同的解决方案来解决我的问题,但它就是行不通。

我调用了 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);
}

最佳答案

我之前遇到过 Hook 问题。这不是一个真正的问题,但我这样做的方式不应该。首先,您应该有 2 个从 DLL 导出的函数,SetHookRemoveHookSetHook 函数将从那里调用 SetWindowsHookEx()。如果您尝试从线程或 DLL 的 DLLMain 中调用 SetWindowsHookEx(),该函数不会返回任何错误,但永远不会调用回调函数。有时我花了很多时间才弄明白。

这里贴出我捕获WH_GETMESSAGE的工作代码,你可以从这里引用。

这是我从 DLL 导出的有效 SetHook() 函数。

bool __declspec(dllexport) __stdcall SetHook(DWORD myWnd)
{
mySavedHook = SetWindowsHookEx(WH_GETMESSAGE,
GetMsgProc,
infoContainer.DllHModule,
myWnd);

int errorID = GetLastError();
if (errorID != 0)
{
MessageBoxA(NULL, "Failed to implement hook", "Failed", 0);
MessageBoxA(NULL, to_string(errorID).c_str(), "Error ID", 0);
return false;
}
else
{
return true;
}
}

infoContainer.DllHModule:DLL实例,是DllMain()的第一个参数。myWnd: 是我的线程 ID(不是进程 ID)- 从 GetWindowThreadProcessId(window_handle, NULL) 获取它。要实现全局 Hook ,请使用 0 作为 myWnd

这是我的回调函数。

LRESULT CALLBACK GetMsgProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode >= 0)
{
LPMSG msg = (LPMSG)lParam;
if (msg->message == WM_CALLFUNCTION)
{
MessageBoxA(NULL, "Receive WM_CALLFUNTION", "Good news", 0);
}

}
//Doesn't matter, just call this function and return it.
return CallNextHookEx(_hook, nCode, wParam, lParam);
}

回调函数必须有 CALLBACK 关键字才能工作。

在外部应用程序中,调用 DLL 中的 SetHook() 并使用线程 ID 作为其参数。

关于c++ - SetWindowsHookEx 没有调用我的回调?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13864604/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com