-1

我正在使用 Visual c++ 2012 更新 3 中的一个项目。我需要将键盘连接一段时间并允许用户仅输入密码。所以我禁用了所有键,除了那些需要输入密码的键。它运作良好。但是在 unHook 之后,alt 键会自动按下。我的意思是在脱钩后,如果我按 Tab 键,它就像我按 alt + tab 一样工作。在 Windows 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;   
}
4

1 回答 1

1

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

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

于 2013-10-26T17:03:50.747 回答