gpt4 book ai didi

winapi - 如何使键盘钩子(Hook)跨进程全局化

转载 作者:行者123 更新时间:2023-12-03 18:17:09 27 4
gpt4 key购买 nike

我正在尝试创建一个实用的按键应用程序,这样我就可以执行诸如终止预编程进程或启动某些操作之类的操作。我想我应该在任何应用程序中按住 cmd,然后输入一个 4 位命令键,这样我就可以在编程、调试观看视频等时快速启动或杀死任何东西。

我想出了如何获得键盘回调,但是无论出于何种原因,一旦我点击另一个应用程序,我的击键实用程序就不再接收任何键。即使我点击回到我的控制台窗口或 msvc,我也不会收到任何输入。这是除非它是全局的,那么我如何将钩子(Hook)设置为全局的?

我的代码是

int main()
{
hook = SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, GetModuleHandle(0), 0);
MSG msg;
while(GetMessage(&msg, NULL, 0, 0) > 0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
UnhookWindowsHookEx(hook);
}

最佳答案

为了让所有进程都可以访问您的键盘 Hook ,必须将它放在一个 DLL 中,然后将其加载到每个进程的地址空间中。需要记住的重要一点是,由于 DLL 的每个实例都在单独的进程中加载​​,因此每个实例都将拥有自己的 DLL 中任何全局变量的副本。如果需要在这些实例之间共享数据,最简单的方法是在 DLL 中创建一个共享数据段。以下代码来自我编写的一个 RSI 监控程序。

//
// some data will be shared across all
// instances of the DLL
//
#pragma comment(linker, "/SECTION:.SHARED,RWS")
#pragma data_seg(".SHARED")
int iKeyCount = 0;
HHOOK hKeyboardHook = 0;
HHOOK hMouseHook = 0;
#pragma data_seg()

//
// instance specific data
//
HMODULE hInstance = 0;

//
// DLL load/unload entry point
//
BOOL APIENTRY DllMain(HANDLE hModule,
DWORD dwReason,
LPVOID lpReserved)
{
switch (dwReason)
{
case DLL_PROCESS_ATTACH :
hInstance = (HINSTANCE) hModule;
break;

case DLL_THREAD_ATTACH :
break;

case DLL_THREAD_DETACH :
break;

case DLL_PROCESS_DETACH :
break;
}
return TRUE;
}

//
// keyboard hook
//
LRESULT CALLBACK KeyboardProc(int code, // hook code
WPARAM wParam, // virtual-key code
LPARAM lParam) // keystroke-message information
{
if ((lParam & 0x80000000) != 0)
{
++iKeyCount;
}
return CallNextHookEx(hKeyboardHook, code, wParam, lParam);
}

//
// mouse hook
//
LRESULT CALLBACK MouseProc(int code, // hook code
WPARAM wParam, // message identifier
LPARAM lParam) // mouse coordinates
{
switch (wParam)
{
case WM_LBUTTONDOWN :
case WM_MBUTTONDOWN :
case WM_RBUTTONDOWN :
case WM_LBUTTONDBLCLK :
case WM_MBUTTONDBLCLK :
case WM_RBUTTONDBLCLK :
++iKeyCount;
break;
}
return CallNextHookEx(hMouseHook, code, wParam, lParam);
}

//
// install keyboard/mouse hooks
//
void KBM_API InstallHooks(void)
{
hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, hInstance, 0);
hMouseHook = SetWindowsHookEx(WH_MOUSE, MouseProc, hInstance, 0);
}

//
// remove keyboard/mouse hooks
//
void KBM_API RemoveHooks(void)
{
UnhookWindowsHookEx(hKeyboardHook);
UnhookWindowsHookEx(hMouseHook);
hKeyboardHook = hMouseHook = 0;
}

//
// retrieve number of keystrokes
//
int KBM_API FetchKeyCount(bool bClear)
{
int kc = iKeyCount;
if (bClear)
iKeyCount = 0;
return kc;
}

关于winapi - 如何使键盘钩子(Hook)跨进程全局化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/454477/

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