0

我正在使用 PostMessage 将 Windows 消息发送到应用程序。现在,此代码在发送除 ARROW 键(VK_RIGHT 或 VK_LEFT)之外的任何键时都可以正常工作。

procedure SendKey(key: Variant);
var
  lParam: integer;
  scancode: integer;
begin
  if (VarType(key) = varUString) then
  begin
    scancode := MapVirtualKey(Ord(VarToStr(key)[1]), MAPVK_VK_TO_VSC);
    lParam := scancode shl 16;
    PostMessage(_hWindow, WM_KEYDOWN, scancode, lParam);
    PostMessage(_hWindow, WM_KEYUP, scancode, lParam);
  end else
  begin
    lParam := MapVirtualKey(key, MAPVK_VK_TO_VSC) shl 16;
    PostMessage(_hWindow, WM_KEYDOWN, key, lParam);
    PostMessage(_hWindow, WM_KEYUP, key, lParam);
  end;
end;

我安装了一个键盘挂钩来监视 VK_LEFT/RIGHT 的 WM_KEYDOWN/UP 消息,以查看 lParam 的样子,我遇到了一些奇怪的值,这是按下右箭头键 (VK_RIGHT) 时的 DebugView 输出。

[2776] wParam: 39, lParam: 21823489
[2776] wParam: 39, lParam: -1051918335

如果我尝试使用硬编码的这些值发送消息,也没有任何反应,知道发生了什么吗?谢谢。

4

1 回答 1

1

这取决于应用程序如何处理输入。有时应用程序直接从消息循环而不是窗口过程来处理这个问题。有时应用程序会使用原始输入。大概您的目标应用程序就是这种性质。

通常,这些问题是由试图伪造输入到不想接受虚假输入的程序的人提出的。您可能无法伪造对程序的输入。或者您可以使用SendInput. 这一切都取决于目标应用程序

如果您的目标应用程序准备好接受自动化,您应该为此使用接受的方法,即 UI 自动化。

于 2015-12-01T19:04:30.023 回答