VK_LEFT / VK_RIGHT未由应用程序处理?

时间:2015-12-01 18:57:27

标签: delphi user-input window-messages

我正在使用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

如果我尝试发送带有硬编码这些值的消息,也没有任何反应,任何想法发生了什么?感谢。

1 个答案:

答案 0 :(得分:1)

这取决于应用程序如何处理输入。有时,应用程序直接从消息循环而不是窗口过程处理此问题。有时应用程序使用原始输入。据推测,您的目标应用具有这种性质。

一般来说,这些问题会被试图伪装输入到不想接受虚假输入的程序的人询问。您可能无法伪造输入到您的程序中,这似乎是合理的。或者您可以使用SendInput。这一切都取决于目标应用

如果您的目标应用程序已准备好接受自动化,则应使用可接受的方法UI自动化。