让我们说我希望抓住 Control-A 组合。
到目前为止,这是我的代码,在Windows Hook函数中:
KBDLLHOOKSTRUCT kbdStruct = *((KBDLLHOOKSTRUCT *)lParam);
if (kbdStruct.vkCode == 0x41)
{
MessageBox(NULL, TEXT("A has been pressed!"), TEXT("key pressed"), MB_ICONINFORMATION);
}
由于用户首先按下Control键(并按下按键几毫秒),我上面的键盘挂钩应该最初忽略该键,对吗?我想我需要留意这封信" A"一旦检测到,我应该检查修改器的状态,控制键?
可能有一些 AND 面具吗?
添加:让我们说我需要一个Control-B或Control-C或Control-D一直到Control-Z。也许我需要的是Alt-A,Alt-B或Alt-C ...一直到Alt-Z
如何混合2个部分匹配? (字母键加上修饰键)。
答案 0 :(得分:4)
请不要使用键盘钩子DLL - 将代码注入到不能处理键盘钩子并造成系统不稳定的进程中。
你是想抓住" CTRL + A"因为你正试图实现类似"选择全部"在你的应用程序内如果是这种情况,那么当您的应用具有焦点时,您只需要keyboard accelerator来捕捉此键盘序列。
但是如果你需要抓住你应该尝试查看RegisterHotKey API。我认为如果你需要一个全局钩子,那应该满足你的需求。但要注意 - 我不确定如果您注册CTRL + A并且应用程序正在使用该键组合来执行类似"选择所有"。
答案 1 :(得分:1)
你去了:
LRESULT __stdcall Process_Ctl_A(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode >= 0 && wParam == WM_KEYDOWN)
{
KBDLLHOOKSTRUCT kbdStruct = *((KBDLLHOOKSTRUCT *)lParam);
if (kbdStruct.vkCode == 0x41 && GetAsyncKeyState(VK_CONTROL) & 0x8000)
{
MessageBox(NULL, TEXT("Control-A combination has been pressed!"), TEXT("key pressed"), MB_ICONINFORMATION);
}
}
return CallNextHookEx(hook, nCode, wParam, lParam);
}