首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20221107A01HTC00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券