Java 我可以移动另一个程序吗';焦点前面的窗口是什么?
我正在使用第三方应用程序的API与之交互,并希望在用户执行某个操作时将其移动到焦点的前面(以便它位于所有其他打开的窗口之上)。虽然我可以很容易地在层次结构中上下移动我的应用程序,但似乎没有办法与其他窗口交互。可以用Java将另一个程序的窗口移到前面吗?这在纯Java中是不可能的,在某些操作系统上甚至不可能干净地获得其他窗口的位置(例如,好运在OS X 10.4下这么做:OS X 10.4没有任何注册其他windows事件的记录手段,有“黑客”,但它们确实是黑客,比如要求用户打开“允许辅助设备”首选项,这需要OS X管理员密码)Java 我可以移动另一个程序吗';焦点前面的窗口是什么?,java,windows,Java,Windows,我正在使用第三方应用程序的API与之交互,并希望在用户执行某个操作时将其移动到焦点的前面(以便它位于所有其他打开的窗口之上)。虽然我可以很容易地在层次结构中上下移动我的应用程序,但似乎没有办法与其他窗口交互。可以用Java将另一个程序的窗口移到前面吗?这在纯Java中是不可能的,在某些操作系统上甚至不可能干净地获得其他窗口的位置(例如,好运在OS X 10.4下这么做:OS X 10.4没有任何注册其他windows事件的记录手段,有“黑客”,但它们确实是黑客,比如要求用户打开“允许辅助设备”首
警告:这仅适用于windows我正在寻找一个非常类似问题的解决方案。 到目前为止,我已经找到了一个非常脆弱的解决方案。 它适用于我的案例,因为我的案例涉及使用
java.awt.Robot
运行整个会话,而无需用户交互,因此它可能适用于您的案例,也可能不适用于您的案例
解决方案是使用java.awt.Robot
发送类似Alt+Tab
的按键,将所需的窗口带到前面。
这当然是脆弱的,原因有多种:
- 机器人无法知道需要多久发送一次
,才能将所需的窗口移到前面。该窗口是众多窗口中的一个。此解决方案仅在已知该窗口的Alt+Tab
-计数时有效Alt-Tab
- 根据操作系统的不同,所需的击键实际上可能是其他的
Alt Tab
下面的Java程序演示了如何执行此操作。如果在没有参数的情况下调用,它将只生成一个Alt+Tab
击键。如果使用参数调用,程序将假定第一个参数是一个数字,并将生成该数字指定的任意多个Alt+Tab
击键
您可能想利用robot.delay()
和robot.setAutoDelay()
中给出的计时值来在您的机器上提供最佳体验。提示:至少在Linux上,robot.setAutoDelay()是这样的
当然应该小于键盘重复延迟,否则操作系统会因为按键重复而在系统的事件队列中生成多个Alt Tab
按键。
import java.awt.AWTException;
导入java.awt.Robot;
导入静态java.awt.event.KeyEvent.VK_ALT;
导入静态java.awt.event.KeyEvent.VK_选项卡;
导入静态java.lang.Integer.parseInt;
公共类窗口开关{
公共静态void main(最终字符串…args)抛出AWTException{
final int repeat=args.length!=0?parseInt(args[0]):1;
最终机器人=createRobot();
机器人按键(VK_ALT);
for(int i=0;i
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;
}
}