我试图通过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中,我无法理解最后一个参数的工作原理。
3条答案
按热度按时间qoefvg9y1#
使用SendInput而不是PostMessage模拟键盘输入。
你不能simulate keyboard input with PostMessage。
关于键盘状态/异步状态,仍有一些注意事项:
SendInput函数不会重置键盘的当前状态。因此,如果在调用此函数时用户按下了任何键,这些键可能会干扰此函数生成的事件。如果您担心可能的干扰,请使用GetAsyncKeyState函数检查键盘的状态,并根据需要进行更正。
WM_KEYDOWN Notification的lParam是根据字段的位指定的:
警告:任何基于PostMessage构建的解决方案都将非常脆弱。
cidc1ykv2#
看一下http://inputsimulator.codeplex.com,它 Package 了Kevin提到的
SendInput
方法tkclm6bt3#
在Spy++中,如果右键单击突出显示的(记录的消息)条目并查看其属性,您可以看到lParam的确切值。然后,您可以将其用作lParam,以确保PostMessage产生与手动操作类似的效果。