1

我正在尝试自动化一个过程,这需要控制一些非 Delphi 窗口。具体来说,我想要一个按钮来简单地将焦点转移到另一个应用程序,虚拟按下 F11,然后返回到 Delphi。另一个程序是模糊的,所以最简单的方法是模拟“alt+tab”来切换焦点。我已经尝试了许多发布的示例,但它们没有产生结果。

4

2 回答 2

0

您可以完全按照您的建议进行操作:模拟“alt+tab”切换焦点虚拟按 F11返回您的程序SendInput可以将键盘事件放在键盘输入流中。请务必阅读文档以了解失败的条件,例如 UIPI、现有键盘状态等。

下面测试使背景 Internet Explorer 窗口全屏,然后将焦点返回到应用程序。随心所欲地重构它:

var
  Inputs: array[0..1] of TInput;
begin
  ZeroMemory(@Inputs, SizeOf(Inputs));

  // alt+tab down
  Inputs[0].Itype := INPUT_KEYBOARD;
  Inputs[0].ki.wVk := VK_MENU;
  Inputs[1].Itype := INPUT_KEYBOARD;
  Inputs[1].ki.wVk := VK_TAB;
  SendInput(2, Inputs[0], SizeOf(Inputs[0]));

  // wait for the task switch dialog
  Sleep(100);

  // alt+tab up
  Inputs[0].Itype := INPUT_KEYBOARD;
  Inputs[0].ki.wVk := VK_TAB;
  Inputs[0].ki.dwFlags := KEYEVENTF_KEYUP;
  Inputs[1].Itype := INPUT_KEYBOARD;
  Inputs[1].ki.wVk := VK_MENU;
  Inputs[1].ki.dwFlags := KEYEVENTF_KEYUP;
  SendInput(2, Inputs[0], SizeOf(Inputs[0]));

  // so that we can deactivate
  Application.ProcessMessages;

  // press F11
  Inputs[0].Itype := INPUT_KEYBOARD;
  Inputs[0].ki.wVk := VK_F11;
  Inputs[0].ki.dwFlags := 0;
  SendInput(1, Inputs[0], SizeOf(Inputs[0]));

  // F11 up
  Inputs[0].Itype := INPUT_KEYBOARD;
  Inputs[0].ki.wVk := VK_F11;
  Inputs[0].ki.dwFlags := KEYEVENTF_KEYUP;
  SendInput(1, Inputs[0], SizeOf(Inputs[0]));

  // give chance to the application to go fullscreen
  Sleep(100);

  // alt+tab down again
  Inputs[0].Itype := INPUT_KEYBOARD;
  Inputs[0].ki.wVk := VK_MENU;
  Inputs[0].ki.dwFlags := 0;
  Inputs[1].Itype := INPUT_KEYBOARD;
  Inputs[1].ki.wVk := VK_TAB;
  Inputs[1].ki.dwFlags := 0;
  SendInput(2, Inputs[0], SizeOf(Inputs[0]));

  // wait for alt+tab dialog
  Sleep(100);

  //alt+tab up
  Inputs[0].Itype := INPUT_KEYBOARD;
  Inputs[0].ki.wVk := VK_TAB;
  Inputs[0].ki.dwFlags := KEYEVENTF_KEYUP;
  Inputs[1].Itype := INPUT_KEYBOARD;
  Inputs[1].ki.wVk := VK_MENU;
  Inputs[1].ki.dwFlags := KEYEVENTF_KEYUP;
  SendInput(2, Inputs[0], SizeOf(Inputs[0]));
end;
于 2013-09-17T14:49:06.280 回答
-1

好吧,您可以使用表单中的 EnumChildWindows() 来获取要单击或键入某些内容或任何内容的窗口的 HWND,并在其上使用带有消息 WM_SYSKEYDOWN 的 SendMessage(如果您使用的是功能键,如果没有,请使用 WM_CHAR或 WM_KEYDOWN),这可能会在窗口上生成一个虚拟按键而无需关注它,如果您也想关注它,请使用消息 WM_SETFOCUS

于 2013-09-17T00:20:24.477 回答