WM_KEYDOWN:如何使用它?

4

我正在尝试通过PostMessage将按键发送到一个应用程序。我正在使用Spy++来尝试理解如何发送消息,因为我并不完全理解它的内部工作原理。

alt text

在这张图片中,第一项(选中项)是我自己实际按下的按键。下面有一个红色椭圆圈的是使用以下代码创建的:
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个回答

14

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

你无法使用PostMessage模拟键盘输入

关于键盘状态/异步状态,仍有一些注意事项

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


WM_KEYDOWN通知的lParam参数是根据字段的位指定的:

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

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


我想使用这个,因为它可以让我在没有窗口焦点的情况下发送输入。还有其他方法可以实现这个吗? - devoured elysium
使用辅助功能来执行所需的操作,而不是模拟输入。 - Raymond Chen
@RaymondChen 我已阅读了你博客中的相关文章。在所有的文章中,您都严厉批评了试图通过 PostMessage 或其他方式发送输入到应用程序的行为。您能否解释一下 Michal Zygmunt 应该如何解决他的问题?链接 - SMUsamaShah

1

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接