有些人希望通过向窗口的输入消息队列发送键盘消息,来实现键盘的模拟。
从很多方面来说,这不大靠谱,为何?
首先,键盘输入比那些印在英文键盘上的字母要复杂得多。带有重音符号的语言有死键(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》