请勿使用PostMessage来模拟键盘输入
有些人希望通过向窗口的输入消息队列发送键盘消息,来实现键盘的模拟。
从很多方面来说,这不大靠谱,为何?
首先,键盘输入比那些印在英文键盘上的字母要复杂得多。带有重音符号的语言有死键(Dead Key),远东语言有各种输入法编辑器,我不知道复杂的脚本语言如何处理输入。
这意味着,键入字符不仅仅是按一个键,而可能是按下一个组合键。
其次,即使你有办法将输入消息投递到目标窗口的消息队列中,也不会更新键盘 SHIFT 按键的状态。当其他应用程序代码调用 GetKeyState 函数或 GetAsyncKeyState 函数时,它会看到“真实”的移位状态,而不是你投递的消息生成的虚假状态。
有一个办法
SendInput 函数设计用于将输入注入到窗口消息队列中。如果你使用这个 API ,那么至少可以正确地处理 SHIFT 按键的状态。(不过,我无法帮助你解决复杂的输入问题。)
尽管可以使用 SendInput,但是有些人可能会说,我还可以使用 mouse_event 和 keybd_event。
但如果你仔细查看 MSDN,则会看到文档里有这么一句话:
Note This function has been superseded. Use SendInput instead.
也就是说,官方推荐我们使用 SendInput,而不是***_event。
“superseded”的意思是:我以将这个 API 标记为 “过时的,废弃的”,可能在以后的某个新版本Windows中,这两个函数将不再可用。
所以,长痛不如短痛,还是尽量使用 SendInput 吧。
总结
赶紧打开我的 Topomel Box 工程,搜索了下:嗯,确实是用的 SendInput。
妥了。
最后
Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《You can’t simulate keyboard input with PostMessage》
最近我写了个东西
正如你们所知道的,拓扑梅尔智慧办公平台(Topomel Box)是一款绿色软件,主要面向经常使用电脑的朋友。它提供了各种提升办公效率的小功能,同时操作上尽可能地简单方便。
我想:你值得拥有。
相关推荐
- IContextMenu第二部分:显示上下文菜单
- Posted on 11月01日
- C++20 Ranges在VS2019 v16.10中全面完成
- Posted on 06月12日
- 小技巧:Fedora17中设置静态IP地址
- Posted on 06月15日
- 说一说那些Win95中奇怪的函数
- Posted on 01月07日
评论已关闭。