Использование Java для установки фокуса на не-Java-приложение в Windows
Я хотел бы написать приложение, которое создает вход для приложения, отличного от Java, в Windows. С классом Robot легко создать ввод, но мне нужно установить фокус на другое текстовое поле приложения и ввести текст там.
Не волнуйтесь, я не пытаюсь написать что-то злонамеренное, я просто хочу использовать Java для "расширения" старого приложения, написанного в Delphi.
Ответы
Ответ 1
CMDOW - это утилита командной строки, которая позволяет выполнять различные действия в окне, такие как активация/деактивация, листинг, минимизация/максимизация и др.
Альтернативно, вы можете написать VBScript для активации другого приложения. Например:
Set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.AppActivate("Firefox")
Затем используйте Runtime.exec
из своего приложения Java, чтобы выполнить script.
Это поможет вам активировать другое приложение.
Однако, это будет намного сложнее, если вы хотите сосредоточиться на текстовом поле в другом приложении и написать текст.
Ответ 2
Обнаружение специального приложения и его перенос на передний план может потребовать встроенного помощника, но на данный момент вы можете отправить ALT + TAB, чтобы активировать "следующее" приложение
Это работает:
public void switchFocus() {
try {
Robot r = new Robot();
r.keyPress(KeyEvent.VK_ALT);
r.keyPress(KeyEvent.VK_TAB);
r.keyRelease(KeyEvent.VK_ALT);
r.keyRelease(KeyEvent.VK_TAB);
} catch(AWTException e) {
// handle
}
}
вам просто нужно реализовать метод удобства для сопоставления символов (от строки) до значений ключевых событий... (или найти какое-то существующее решение)
Ответ 3
Настройте задержку, иначе она не будет работать:
Robot r = new Robot();
r.keyPress(KeyEvent.VK_ALT);
r.keyPress(KeyEvent.VK_TAB);
r.delay(10); //set the delay
r.keyRelease(KeyEvent.VK_ALT);
r.keyRelease(KeyEvent.VK_TAB);
Ответ 4
На Mac можно сделать это с помощью AppleScript. AppleScript интегрирован в систему, поэтому он всегда будет функционировать.
https://developer.apple.com/library/content/documentation/AppleScript/Conceptual/AppleScriptLangGuide/reference/ASLR_cmds.html
Вам нужно только определить, что вы находитесь на mac и имеет имя приложения.
Runtime runtime = Runtime.getRuntime();
String[] args = { "osascript", "-e", "tell app \"Chrome\" to activate" };
Process process = runtime.exec(args);
Ответ 5
Вам нужно добавить достаточную задержку, чтобы приложение полностью инициализировало и получило фокус.
Вот базовый рабочий пример... Andreas_D правильно, что вам нужно эмулировать системный ключ для переключения между программами... (Alt + Tab в Windows, Cmd + Tab в OS X)
import java.awt.*;
import static java.awt.event.KeyEvent.*;
import java.io.IOException;
public class RobotSample {
//https://stackoverflow.com/info/4782231
private static Integer[] KEY_CODES = { VK_S, VK_T, VK_A, VK_C, VK_K, VK_O, VK_V, VK_E, VK_R, VK_F, VK_L,VK_O, VK_W, VK_DECIMAL, VK_C, VK_O, VK_M, VK_SLASH, VK_Q, VK_U, VK_E, VK_S, VK_T, VK_I, VK_O, VK_N, VK_S, VK_SLASH, VK_4, VK_7, VK_8, VK_2, VK_2, VK_3, VK_1, VK_ENTER };
public static void main( String[] args ) throws IOException {
try {
Robot robot = new Robot();
Runtime runtime = Runtime.getRuntime();
runtime.exec( "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe" );
robot.keyPress( VK_ALT );
robot.keyPress( VK_TAB );
robot.keyRelease( VK_ALT );
robot.keyRelease( VK_TAB );
//Chill a sec...
robot.delay( 1000 );
for(int i = 0; i < KEY_CODES.length; ++i) {
robot.keyPress( KEY_CODES[i] );
robot.keyRelease( KEY_CODES[i] );
robot.delay( 80 );
}
} catch( AWTException e ) {
e.getMessage();
}
}
}