在可视C++中键盘挂钩后出现意外行为

Unexpected behavior after keyboard hook in visual C++

本文关键字:意外 C++ 可视 键盘      更新时间:2023-10-16

我正在处理Visual c ++ 2012 update 3中的一个项目。我需要挂上键盘一段时间,只允许用户输入密码。所以我禁用了除键入密码所需的密钥之外的所有密钥。效果很好。但是在取消挂钩后,alt 键会自动按下。 我的意思是解开钩后,如果我按 Tab 键,它就像我按 Alt + Tab 一样工作。在窗口 8 中,按下 win 键。但是一旦我手动按下键盘上的alt键,问题就解决了。但这对我来说是一个非常严重的情况,因为由于这种奇怪的行为,用户肯定会失去对我的应用程序的信任。任何人都可以帮忙吗?

LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode < 0 || nCode != HC_ACTION ) return CallNextHookEx( NULL, nCode, wParam, lParam); 
KBDLLHOOKSTRUCT* p = (KBDLLHOOKSTRUCT*) lParam;
if(
    (p->vkCode == VK_BACK) ||
    (p->vkCode == VK_SHIFT) ||
    (p->vkCode == VK_CAPITAL) ||
    (p->vkCode == VK_SPACE) ||
    (p->vkCode == VK_HOME) ||
    (p->vkCode == VK_END) ||
    (p->vkCode == VK_LEFT) ||
    (p->vkCode == VK_RIGHT) ||
    (p->vkCode == VK_DELETE) ||
    (p->vkCode >= 0x30 && p->vkCode <= 0x39) ||
    (p->vkCode >= 0x41 && p->vkCode <= 0x5A) ||
    (p->vkCode >= 0x60 && p->vkCode <= 0x6F) ||
    (p->vkCode == 0x90) ||
    (p->vkCode == 0x91) ||
    (p->vkCode == 0xA0) ||
    (p->vkCode == 0xA1) ||
    (p->vkCode >= 0xBA && p->vkCode <= 0xC0) ||
    (p->vkCode >= 0xDB && p->vkCode <= 0xDF) ||
    (p->vkCode == 0xE2)
    )
    {
        return CallNextHookEx(NULL, nCode, wParam, lParam);  
    }
    else
        return 1;   
}

如果在应用程序开始之前按下 alt 键,或者在应用程序无法挂接它时按住 alt 键(例如,发送到以管理员身份运行的进程的窗口),您的钩子将吃掉它的键,当用户停止按下它时,系统的其余部分仍将认为它被按下了。

你可以在钩子完成后(或者在钩子中内置一个过滤器)使用 SendInput 为它发送一个键控,但这并不能确保获得键控的窗口知道它已经启动了。我不确定这部分是否有特别简单的解决方案。