如何配置KeyboardProc以避免击键?

时间:2012-08-15 20:24:23

标签: hook

我需要实现一个代码来识别和忽略Windows中的某些键盘输入,并且我正在使用整个安装钩子的东西(我需要它来阻止 Alt + Tab ,< kbd> Windows + Tab , Windows + D 等)。鉴于只有在我的软件具有焦点(将在FullScreen模式下)时才会发生这种情况,因此不需要(我认为)实现系统范围的钩子(使用DLL等),所以我是现在尝试配置我的KeyboardProc函数以执行我需要的操作。

问题在于我无法使其发挥作用。我已经能够检测到特定的密钥,但不能让Windows忽略它。

这就是我现在所拥有的(在Qt中):

LRESULT CALLBACK KeyboardProc(int code,WPARAM wParam,LPARAM lParam)
{
    if (code < 0)
        return CallNextHookEx(NULL, code, wParam, lParam);

    switch(wParam)
    {
    case VK_LWIN:
        qDebug() << "VK_LWIN";
        return NULL;
    break;

    case 0x41:    //A
        qDebug() << "A";
        return false;
    break;
    }

    return CallNextHookEx(NULL, code, wParam, lParam);
}

无论我在回程中输入什么,系统仍然可以获得键输入。

那么我需要把它放在那里?

1 个答案:

答案 0 :(得分:1)

毕竟我想出了怎么做。不同之处在于我移动使用了低级键盘钩子,因此功能名称发生了变化。这是:

LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode < 0)
    return CallNextHookEx(NULL, nCode, wParam, lParam);

tagKBDLLHOOKSTRUCT *str = (tagKBDLLHOOKSTRUCT *)lParam;

switch(str->flags)
{
    case (LLKHF_ALTDOWN):
        qDebug() << "ALT";
        delete str;
    return 1;
}

if (wParam == WM_KEYDOWN)
{
    switch (str->vkCode)
    {
        case VK_RWIN:
        case VK_LWIN:
        case VK_LCONTROL:
        case VK_RCONTROL:
        case VK_APPS:
        case VK_SLEEP:
        case VK_MENU:
            qDebug() << "SPECIAL PRESS";
            delete str;
        return 1;
    }
}

return CallNextHookEx(NULL, nCode, wParam, lParam);
}