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