Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我可以移动另一个程序吗';焦点前面的窗口是什么?_Java_Windows - Fatal编程技术网

Java 我可以移动另一个程序吗';焦点前面的窗口是什么?

Java 我可以移动另一个程序吗';焦点前面的窗口是什么?,java,windows,Java,Windows,我正在使用第三方应用程序的API与之交互,并希望在用户执行某个操作时将其移动到焦点的前面(以便它位于所有其他打开的窗口之上)。虽然我可以很容易地在层次结构中上下移动我的应用程序,但似乎没有办法与其他窗口交互。可以用Java将另一个程序的窗口移到前面吗?这在纯Java中是不可能的,在某些操作系统上甚至不可能干净地获得其他窗口的位置(例如,好运在OS X 10.4下这么做:OS X 10.4没有任何注册其他windows事件的记录手段,有“黑客”,但它们确实是黑客,比如要求用户打开“允许辅助设备”首

我正在使用第三方应用程序的API与之交互,并希望在用户执行某个操作时将其移动到焦点的前面(以便它位于所有其他打开的窗口之上)。虽然我可以很容易地在层次结构中上下移动我的应用程序,但似乎没有办法与其他窗口交互。可以用Java将另一个程序的窗口移到前面吗?

这在纯Java中是不可能的,在某些操作系统上甚至不可能干净地获得其他窗口的位置(例如,好运在OS X 10.4下这么做:OS X 10.4没有任何注册其他windows事件的记录手段,有“黑客”,但它们确实是黑客,比如要求用户打开“允许辅助设备”首选项,这需要OS X管理员密码)


警告:这仅适用于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;
    }
}