Могу ли я переместить окно другой программы в центр фокуса? - PullRequest
6 голосов
/ 23 апреля 2010

Я взаимодействую со сторонним приложением, используя его API, и хотел бы переместить его в центр фокуса (чтобы он был поверх всех других открытых окон), когда пользователь выполняет определенное действие. Несмотря на то, что я могу довольно легко перемещать свое приложение вверх и вниз по иерархии, похоже, не существует способа взаимодействия с другими окнами. Можно ли переместить окно другой программы вперед с помощью Java?

Ответы [ 3 ]

4 голосов
/ 23 апреля 2010

Вы не можете сделать это в чистом Java-коде, но вы можете использовать JNI.См. В Java Swing, как получить ссылку дескриптора окна Win32 (hwnd) на окно? , чтобы узнать, как получить дескриптор окна.Тогда вы можете сделать что-то вроде http://msdn.microsoft.com/en-us/library/ms633545, чтобы переместить его вперед.

Предупреждение: это только для окон

1 голос
/ 23 апреля 2010

Это не возможно в чистой Java, и в некоторых операционных системах невозможно даже получить чистую позицию другого окна (например, удачи в этом случае в OS X 10.4: OS X 10.4 не имеет какие-либо документированные значит регистрироваться на события других окон ... Есть "хаки", но они действительно хакерские, например, требуют от пользователя включения предпочтений "Разрешить вспомогательное устройство" , что требует OS X admin passord).

0 голосов
/ 30 августа 2014

Я искал решение очень похожей проблемы. До сих пор я нашел одно - очень хрупкое! - решение. Это работает для моего случая, потому что мой случай включает в себя запуск целых сеансов с использованием java.awt.Robot без взаимодействия с пользователем, поэтому он может - или не может - работать для вашего случая.

Решение использует java.awt.Robot для отправки нажатий клавиш, например Alt+Tab, чтобы вывести желаемое окно на передний план. Конечно, это хрупко по нескольким причинам:

  • Робот не может знать, как часто нужно отправлять Alt+Tab, чтобы вывести желаемое окно вперед. Окно одно во многих. Это решение работает, только если уже известно, какое окно с точки зрения Alt-Tab -count это.
  • В зависимости от операционной системы требуемое нажатие клавиши может быть чем-то другим.

Если ОС и последовательность окон известны, то есть программа может заранее знать, сколько потребуется Alt-Tab нажатий клавиш, иногда это может быть решением.

Следующая Java-программа демонстрирует, как это сделать. Если вызывается без аргументов, он генерирует ровно одно Alt+Tab нажатие клавиши. Если вызывается с аргументами, программа предполагает, что первый аргумент является числом, и генерирует столько Alt+Tab нажатий клавиш, сколько указано этим числом.

Возможно, вы захотите немного поиграть со значениями синхронизации, указанными в robot.delay() и robot.setAutoDelay(), чтобы обеспечить наилучшие впечатления на вашей машине. Подсказка: по крайней мере в Linux robot.setAutoDelay(), безусловно, должно быть меньше, чем задержка повторения клавиатуры, в противном случае ОС генерирует множественные нажатия клавиш Alt-Tab в очереди событий системы из-за повторения клавиш.

import java.awt.AWTException;
import java.awt.Robot;
import static java.awt.event.KeyEvent.VK_ALT;
import static java.awt.event.KeyEvent.VK_TAB;
import static java.lang.Integer.parseInt;

public class WindowSwitcher {
    public static void main(final String... args) throws AWTException {
        final int repeat = args.length != 0 ? parseInt(args[0]) : 1;
        final Robot robot = createRobot();
        robot.keyPress(VK_ALT);
        for (int i = 0; i < repeat; i++) {
            robot.keyPress(VK_TAB);
            robot.keyRelease(VK_TAB);
            robot.delay(500);
        }
        robot.keyRelease(VK_ALT);
    }
    public static Robot createRobot() throws AWTException {
        final Robot robot = new Robot();
        robot.setAutoWaitForIdle(true);
        robot.setAutoDelay(10);
        return robot;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...