我想编写一个全局键盘钩子来禁止任务切换。当我用Google搜索时,我在c#,cpp(和delphi)中发现了很多代码,但我需要一些关于挂钩的基本概念(如果是示例,那将是最好的在C)。所以,请建议资源,链接可以帮助我从C的角度理解事物。
PS:我找到了一个好的working example(适用于winXP和旧版本),但是当我尝试编译代码时它给了我:
我试着搜索所有标题中的“IDC_”常量(MinGW gcc安装和开发人员提供的默认值),但没有运气......如果任何人可以编译代码并让它运行请帮助我。我没有上传源本身,因为有一些头文件依赖,在这种情况下,我必须在这里发布所有代码。
winXP是目标环境,但是如果我还能运行Win7会更好。
答案 0 :(得分:8)
假设您使用的是Windows,并且您希望捕获全局击键,我将在这里发挥作用。一种方法是使用LowLevelHooks。请看以下示例:
在代码中的某处定义此回调函数:
//The function that implements the key logging functionality
LRESULT CALLBACK LowLevelKeyboardProc( int nCode, WPARAM wParam, LPARAM lParam )
{
char pressedKey;
// Declare a pointer to the KBDLLHOOKSTRUCTdsad
KBDLLHOOKSTRUCT *pKeyBoard = (KBDLLHOOKSTRUCT *)lParam;
switch( wParam )
{
case WM_KEYUP: // When the key has been pressed and released
{
//get the key code
pressedKey = (char)pKeyBoard->vkCode;
}
break;
default:
return CallNextHookEx( NULL, nCode, wParam, lParam );
break;
}
//do something with the pressed key here
....
//according to winapi all functions which implement a hook must return by calling next hook
return CallNextHookEx( NULL, nCode, wParam, lParam);
}
然后在你的main函数中的某个地方设置钩子就像这样:
//Retrieve the applications instance
HINSTANCE instance = GetModuleHandle(NULL);
//Set a global Windows Hook to capture keystrokes using the function declared above
HHOOK test1 = SetWindowsHookEx( WH_KEYBOARD_LL, LowLevelKeyboardProc, instance,0);
可以找到关于钩子的更多一般信息here。 您也可以按照SetWindowsHooksEX文档中给出的说明,以完全相同的方式捕获其他全局事件。