Я пытаюсь автоматизировать процесс, и для этого требуется управление некоторыми не-Delphi-окнами. В частности, я хотел бы, чтобы кнопка просто переключила фокус на другое приложение, фактически нажмите F11 и вернитесь в Delphi. Другая программа неясна, поэтому самым простым было бы эмулировать «alt + tab» для переключения фокуса. Я пробовал многие из опубликованных примеров, но они не дали результатов.Переключение на другую задачу
ответ
Ну, вы можете использовать EnumChildWindows() из формы, чтобы получить HWND окна, которое вы хотите щелкнуть или набрать что-то или что-нибудь, и использовать SendMessage на нем с сообщением WM_SYSKEYDOWN (если вы используете функциональные клавиши, if не используйте WM_CHAR или WM_KEYDOWN), что, вероятно, приведет к нажатию виртуальной клавиши в окне без необходимости фокусироваться на ней, если вы хотите также сфокусироваться, используйте сообщение WM_SETFOCUS
Вы можете сделать точно так, как вы предлагаете: эмулировать «alt + tab» для переключения фокуса, фактически нажмите F11, вернитесь в свою программу. SendInput
может размещать события клавиатуры в потоке ввода с клавиатуры. Обязательно прочитайте документацию, хотя для условий, когда она не срабатывает, например, UIPI, существующее состояние клавиатуры и т. Д.
Ниже приведено тестирование, чтобы сделать фоновое окно проводника интернета полноэкранным, а затем вернуть фокус в приложение. Рефакторинг его, как вам нравится:
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. Переключение на другую страницу без перезагрузки?
- 2. Переключение на другую версию Perl - модули версии
- 3. Переключение на другую активность за 2 секунды
- 4. Частое переключение на другую текстуру сокрушает игру
- 5. Выполнять задачу каждую секунду и другую задачу, когда это делается
- 6. Создайте задачу, которая выполняет другую задачу с аргументами
- 7. Переключение с картонной сцены на другую на UNITY
- 8. Проблема: iOS UITableView прокрутка останавливает другую задачу
- 9. Добавление некоторой обработки в другую задачу Gradle
- 10. Спрячьте другую задачу изнутри задачи в сельдерей
- 11. Как создать настраиваемую задачу SSIS, которая ссылается на другую библиотеку
- 12. На кнопке нажмите кнопку выполнить другую задачу (HTML)
- 13. Задача ANT вызвать другую задачу на основе ввода
- 14. Перенесите задачу на другую цель после ее запуска [python]
- 15. Как получить фид вывода задачи grunt на другую задачу grunt?
- 16. Как использовать другую задачу в AsyncTask?
- 17. C# упаковка задачи в другую задачу
- 18. Экспорт значения столбца в другую задачу SSIS
- 19. Переключение с одной страницы на другую в bootstrap modal
- 20. Как переключение на другую веб-страницу jquery flask
- 21. Переключение с одной операции на другую проблему с файлом манифеста?
- 22. TortoiseSVN рабочая копия переключение с одной машины на другую машину
- 23. Переключение на другую вкладку в tabhost с намерением
- 24. Автоматическое извлечение ветви, запуск сценария и переключение на другую ветвь
- 25. Переключение бизнес-страницы с одной учетной записи на другую.
- 26. Переключение по диагонали в другую сторону
- 27. Link, который выполняет задачу и переходит в другую точку зрения
- 28. Как назначить другую задачу в .NET, пока текущий блокируется?
- 29. Запустить задачу Java в муравье, используя другую JRE
- 30. Используйте javascript для сохранения состояния кнопки и выполните другую задачу
Начните с прочтения этого: http://msdn.microsoft.com/en-us/library/windows/desktop/ms633539.aspx Я оставил тег Delphi в вопросе , но на самом деле этот вопрос не имеет ничего общего с Delphi. Это чистый вопрос Win32. –
Как указано в ссылке, опубликованной Дэвидом, вы не сможете вернуться в свое приложение. После активации этого другого приложения вы сыграли свою последнюю карточку. Вы должны попытаться решить это по-другому. Начните с изучения того, предоставляет ли другое приложение интерфейс автоматизации. – IInspectable
В чем вопрос? –