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