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