切换到另一个任务

时间:2013-09-16 11:17:55

标签: windows delphi winapi

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

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:-1)

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