на OS X)

ел бы написать приложение, которое создает ввод для не-Java-приложения в Windows. С помощью класса Robot легко генерировать ввод, но мне нужно установить фокус на текстовое поле другого приложения и ввести текст там.

Не волнуйтесь, я не пытаюсь написать что-то вредоносное, я просто хочу использовать Java для «расширения» старого приложения, написанного на Delphi.

 Stijn Vanpoucke24 янв. 2011 г., 14:31
Альтернативный вариант заключается в том, что мое приложение Java никогда не получает фокус, поэтому приложение Windows имеет фокус, и когда вы нажимаете кнопку в приложении Java, фокус никогда не теряется в исходном окне. Понятия не имею, возможно ли это?
 ericsoco13 февр. 2013 г., 19:32
для тех, кто приходит на этот вопрос через Google, на OSX:stackoverflow.com/questions/14859733/...

Ответы на вопрос(5)

Решение Вопроса

CMDOW утилита командной строки, которая позволяет вам выполнять различные действия с окнами, такие как активация / деактивация, листинг, сворачивание / максимизация и т. д.

альтернативноВы можете написать VBScript для активации другого приложения. Например:

Set WshShell = WScript.CreateObject("WScript.Shell") 
WshShell.AppActivate("Firefox")

Тогда используйтеRuntime.exec из вашего Java-приложения, чтобы выполнить скрипт.

Это поможет вам активировать другое приложение.

тем не мениебудет намного сложнее, если вы захотите сосредоточиться на текстовом поле в другом приложении и написать какой-нибудь текст.

 ycomp18 янв. 2018 г., 05:00
просто должен сказать, что мне нравится CMDOW, но я заметил 2 проблемы .. очень медленные .. в моей перегруженной системе с тепловым дросселированием - заказ нового вентилятора сейчас - так что большинство пользователей не знают, будет ли это заметно, однако nircmd много работал быстрее ... так что просто дать людям знать, что nircmd тоже вариант - не поддерживает подстановочные знаки, но вы можете указать, совпадает ли подстрока или с начала или с конца заголовка. Также я не смог заставить его активировать несколько окон с одной и той же подстрокой, nircmd мог бы сделать это .. поэтому по этим двум причинам я выбрал nircmd вместо этого ..
 tomm17 сент. 2018 г., 13:14
@ Dogbane вы знаете что-то похожее для Linux OS?

может потребоваться встроенный помощник, но на данный момент вы можете отправить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
  }
}

вам просто нужно реализовать удобный метод для отображения символов (из String) в значения ключевых событий ... (или найти какое-либо существующее решение)

риложения и получения фокуса.

Вот основной рабочий пример ...Andreas_D правильно, что вам нужно эмулировать системный ключ для переключения между программами ... (Alt+табуляция в Windows,Cmd+табуляция на OS X)

    import java.awt.*;
    import static java.awt.event.KeyEvent.*;
    import java.io.IOException;

    public class RobotSample {

        //https://stackoverflow.com/questions/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();
            }

        }

    }

интегрирован в систему, поэтому он всегда будет функционировать.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);

Настройте задержку, иначе она не будет работать:

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);

Ваш ответ на вопрос