我可以将另一个程序的窗口移动到焦点的前方吗?

时间:2010-04-22 20:49:47

标签: java windows

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

3 个答案:

答案 0 :(得分:4)

您无法在纯Java代码中执行此操作,但您可以使用JNI。有关如何获取窗口句柄,请参阅In Java Swing how do you get a Win32 window handle (hwnd) reference to a window?。然后你可以做http://msdn.microsoft.com/en-us/library/ms633545这样的事情来把它移到前面。

警告:这仅适用于Windows

答案 1 :(得分:1)

在纯Java和某些操作系统中,这是不可能的,甚至不可能干净地获得其他窗口的位置(例如,在OS X 10.4下运气好吧:OS X 10.4 有任何记录意味着注册其他窗口的事件...有“黑客”,但他们真的很hackish,比如要求用户打开“允许辅助设备”首选项,这需要OS X管理员密码)。

答案 2 :(得分:0)

我一直在寻找一个非常类似问题的解决方案。 到现在为止,我找到了一个 - 非常脆弱! - 解决方案。 它适用于我的情况,因为我的情况涉及使用java.awt.Robot运行整个会话而无需用户交互,因此它可能 - 或可能不 - 适用于您的情况。

解决方案是使用java.awt.Robot发送像Alt+Tab这样的关键笔划,将所需的窗口移到前面。 当然,这很脆弱,原因有很多:

  • 机器人无法知道需要发送Alt+Tab的频率以获得所需的窗口。窗口是众多窗口中的一个。此解决方案只有在已知Alt-Tab的哪个窗口时才有效 - 算一算。
  • 根据操作系统的不同,所需的击键可能实际上是别的。

如果OS和窗口序列是已知的,即程序可以预先知道需要多少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;
    }
}