我正在开发visual c ++ 2012 update 3中的一个项目。我需要将键盘挂钩一段时间,并允许用户仅输入密码。所以我禁用除键入密码所需的所有密钥。它运作良好。但是在取消之后,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;
}
答案 0 :(得分:1)
如果在应用程序开始之前按下alt键,或者在应用程序无法挂钩时按下alt键(例如,发送到以管理员身份运行的进程的窗口),您的挂钩将会为其执行密钥,其余的则当用户停止按下它时,系统仍会认为它被按下了。
您可以使用SendInput
在挂钩完成后(或者在挂钩内置过滤器的过程中)为其发送一个keyup,但这不会确保获得keydown的窗口知道它了。我不确定 是该部分的一个特别简单的解决方案。