gpt4 book ai didi

c++ - 未调用 dll Hook 函数

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:27:37 24 4
gpt4 key购买 nike

我试图捕捉并重新翻译键盘和鼠标事件。所以我在 dll 中使用 SetWindowsHookEx 和函数。第一次 Ш 有一个大错误 - GetProcAddress 无法获取我的函数。这个答案对我很有帮助GetProcAddress returns NULL

现在我可以从 dll 中调用函数并且我可以看到钩子(Hook)的效果:我的键盘在程序运行时不起作用。但是钩子(Hook)没有被调用。

main.cpp

#include <Windows.h>
#include <WinUser.h>
#include <iostream>
#include <fstream>
using namespace std;
HHOOK hhk;


int main(){
HINSTANCE hinstLib = LoadLibrary(TEXT("hookdll.dll"));
typedef void (*Install)();
typedef void (*Uninstall)();
typedef LRESULT (_stdcall *HookProcedure)(int, WPARAM , LPARAM );
Install install = (Install) GetProcAddress(hinstLib, "install");
Uninstall uninstall = (Uninstall) GetProcAddress(hinstLib, "uninstall");
HookProcedure hookProc = (HookProcedure) GetProcAddress(hinstLib, "_hookProcedure@12");//omg
cout << GetLastError()<< "\n";
install();
hhk = SetWindowsHookEx(WH_KEYBOARD, hookProc, hinstLib, NULL);
cout << GetLastError()<< "\n";
for(int i = 0; i < 50; i++){
Sleep(200);
cout << i << "\n";
}
UnhookWindowsHookEx(hhk);
uninstall();
return 0;
}

hookdll.cpp

#include <Windows.h>
#include <iostream>
#include <fstream>

HINSTANCE hinst;
HHOOK hhk;
std::ofstream myfile;

extern "C" __declspec(dllexport)
LRESULT CALLBACK hookProcedure(int code, WPARAM w, LPARAM l)
{
MessageBox(NULL, (LPCWSTR)L"HEY HEY", (LPCWSTR)L"Test", MB_OK);
//never saw this message
return CallNextHookEx(NULL, code, w, l);
}

extern "C" __declspec(dllexport) void install() {
myfile.open("log.txt",std::ios_base::app);
myfile << "\ninstall " << GetLastError();
}
extern "C" __declspec(dllexport) void uninstall() {
myfile << "\nuninstall " << GetLastError();
myfile.close();
}

extern "C" __declspec(dllexport)
BOOL WINAPI DllMain( __in HINSTANCE hinstDLL, __in DWORD fdwReason, __in LPVOID lpvReserved) {
hinst = hinstDLL;
return TRUE;
}

最佳答案

键盘 Hook 允许您拦截WM_KEYDOWNWM_KEYUP 窗口消息。控制台应用程序不会收到这些消息,除非有一个事件的 Windows 消息队列。如果您想在控制台应用程序中查看和处理这些消息,请创建一个窗口并为其提供键盘焦点。确保在拥有窗口的线程中使用 GetMessageDispatchMessage WinAPI 调用执行消息pumping

如果您不想创建窗口,您可以使用 WH_KEYBOARD_LL 拦截发送到线程事件消息队列的键盘相关消息。您仍然需要使用 GetMessage 从队列中读取,否则它最终会开始丢弃消息。

关于c++ - 未调用 dll Hook 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16762229/

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