2009-07-23 114 views
2

我想通过PostMessage将关键笔划发送到一个应用程序。我也使用Spy ++来试图理解如何发送消息,因为我没有完全理解它的内部工作原理。WM_KEYDOWN:如何使用它?

alt text

在此画面中,第一项(所选项目)与采用自制的实际关键笔划制成。与它周围的红色elipse的一个(下图)与下面的代码所做的:

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我不明白最后一个参数的工作。

回答

13

使用SendInput而不是PostMessage模拟键盘输入。

您不能simulate keyboard input with PostMessage

还有some caveats相对于键盘状态/异步状态:

的SendInput函数不会重置 键盘的当前状态。 因此,如果用户在调用此函数时按下了任何键 ,它们可能会干扰此函数生成的事件 。如果您 担心可能的 干扰,请使用GetAsyncKeyState 函数检查键盘的 状态,并根据需要进行更正。


的lParam的用于WM_KEYDOWN Notification在字段的比特的术语指定:

  • 前16位是重复计数
  • 下一8位是扫描码
  • 下一位为1表示扩展密钥,否则为0
  • 接下来的4位保留,必须为0
  • 下位始终为0(为WM_KEYDOWN)
  • 下一位是前国家重点
  • 最后一位始终为0(为WM_KEYDOWN)

警告:您构建的任何解决方案基于PostMessage周围会变得非常脆弱。

+0

嗯,我想用这个,因为它会允许我发送输入而不在窗口上具有焦点。有没有其他方法可以实现这一点? – 2009-07-23 07:41:12

0

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