在可视C++中键盘挂钩后出现意外行为
Unexpected behavior after keyboard hook in visual C++
我正在处理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
为它发送一个键控,但这并不能确保获得键控的窗口知道它已经启动了。我不确定这部分是否有特别简单的解决方案。
相关文章:
- 在C++中对T*类型执行std::move的意外行为
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 处理除以零会导致<csignal>意外行为
- vscode下的Arduino代码出现意外编译错误
- 使用++运算符会导致意外的结果
- 套接字读取后,我在缓冲区中看到意外输入
- 更改.cpp程序的输入文件中数据的位置会意外更改输出
- 使用vscode调试时,GDB意外退出
- 此测试()中发生了什么意外过程?为什么总是覆盖 ch[0 1 2..]?
- 尝试将字符串/字符转换为整数会产生意外结果
- 错误 C2760:语法错误:映射迭代器上意外的标记"标识符",预期的";"
- C++标头错误 C2238 意外标记";"
- C++中意外的多头值
- vector.size() 在比较中意外工作
- 使用 malloc() 时出现意外大小
- 多线程程序中出现意外的内存泄漏
- 为什么static_cast基础类型的枚举类int8_t获得意外值?
- 字符串比较中的意外输出
- 我的代码中的意外价值以及我如何修复它
- C++ 编译错误:意外的类型名称"字符串":预期的表达式