请勿使用PostMessage来模拟键盘输入

请勿使用PostMessage来模拟键盘输入

作者:BlogUpdater |  时间:2022-11-07 |  浏览:150 |  评论已关闭 条评论

有些人希望通过向窗口的输入消息队列发送键盘消息,来实现键盘的模拟。
从很多方面来说,这不大靠谱,为何?

首先,键盘输入比那些印在英文键盘上的字母要复杂得多。带有重音符号的语言有死键(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)是一款绿色软件,主要面向经常使用电脑的朋友。它提供了各种提升办公效率的小功能,同时操作上尽可能地简单方便。
我想:你值得拥有。

评论已关闭。