c++ WM_按键:如何使用?

des4xlb0  于 2022-11-27  发布在  其他
关注(0)|答案(3)|浏览(162)

我试图通过PostMessage向一个应用程序发送一个键击。我使用了太多的Spy++来尝试理解如何发送消息,因为我不完全理解它的内部工作原理。

在这张图片中,第一个项目(selected item)是由我自己的一个实际击键生成的。下面那个有红色椭圆的项目是由下面的代码生成的:

WinApi.PostMessage(InsideLobbyHandle, WinApi.WM_KEYDOWN, (int)WinApi.VK_UP, 1);

我猜它一定和最后一个PostMessage()参数有关,但我不知道它是如何工作的。我可以看到在原始击键中ScanCode = 48,而在我的击键中它是0,并且fExtended是1,而在我的击键中它是0。我如何才能使它看起来一样呢?
http://msdn.microsoft.com/en-us/library/ms646280(VS.85).aspx中,我无法理解最后一个参数的工作原理。

qoefvg9y

qoefvg9y1#

使用SendInput而不是PostMessage模拟键盘输入。
你不能simulate keyboard input with PostMessage
关于键盘状态/异步状态,仍有一些注意事项:
SendInput函数不会重置键盘的当前状态。因此,如果在调用此函数时用户按下了任何键,这些键可能会干扰此函数生成的事件。如果您担心可能的干扰,请使用GetAsyncKeyState函数检查键盘的状态,并根据需要进行更正。
WM_KEYDOWN Notification的lParam是根据字段的位指定的:

  • 前16位是重复计数
  • 接下来的8位是扫描码
  • 扩展密钥的下一位为1,否则为0
  • 接下来的4位是保留位,必须为0
  • 下一位始终为0(对于WM_KEYDOWN)
  • 下一位是上一个密钥状态
  • 最后一位始终为0(对于WM_KEYDOWN)

警告:任何基于PostMessage构建的解决方案都将非常脆弱。

cidc1ykv

cidc1ykv2#

看一下http://inputsimulator.codeplex.com,它 Package 了Kevin提到的SendInput方法

tkclm6bt

tkclm6bt3#

在Spy++中,如果右键单击突出显示的(记录的消息)条目并查看其属性,您可以看到lParam的确切值。然后,您可以将其用作lParam,以确保PostMessage产生与手动操作类似的效果。

相关问题