检测到按下Control + some-key的推荐方法是什么?

时间:2014-04-21 01:11:04

标签: c++ windows

让我们说我希望抓住 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个部分匹配? (字母键加上修饰键)。

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);
}