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

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

【键盘|请勿使用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》