代码之家  ›  专栏  ›  技术社区  ›  TwentyMiles

我能把另一个程序的窗口移到焦点的前面吗?

  •  6
  • TwentyMiles  · 技术社区  · 16 年前

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

    3 回复  |  直到 16 年前
        1
  •  5
  •   Community Mohan Dere    9 年前

    您不能用纯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 把它移到前面。

        2
  •  1
  •   SyntaxT3rr0r    16 年前

    这在纯Java中是不可能的,在某些操作系统上甚至不可能完全获得其他windows位置(例如,在osx10.4下祝你好运:osx10.4确实如此) 是否有任何记录意味着注册其他windows的事件。。。有“黑客”,但他们真的黑客,像要求用户打开电脑 首选项,这需要OS X管理密码)。

        3
  •  0
  •   Christian Hujer    11 年前

    我在寻找一个非常类似问题的解决方案。 到现在为止我已经找到了一个- 非常脆弱! -解决方案。 java.awt.Robot 没有用户交互,所以它可能-也可能不-适用于您的情况。

    解决方案是使用 java.awt.Robot机器人 像这样发送按键 Alt+Tab 将所需的窗口移到前面。

    • 机器人不知道多久一次 Alt-Tab
    • 根据操作系统的不同,所需的击键实际上可能是其他的。

    Alt选项卡 击键是必需的,这有时是一个解决方案。

    下面的Java程序演示了如何做到这一点。如果不带参数调用,则只生成一个 Alt+Tab键 Alt+Tab键 按该数字指定的击键。

    您可能需要使用中给出的计时值来进行一些调整 robot.delay() robot.setAutoDelay() robot.setAutoDelay() 当然应该小于键盘重复延迟,否则操作系统会产生多个 Alt选项卡 由于键重复而在系统的事件队列中击键。

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