使用Java将焦点设置为Windows中的非Java应用程序

时间:2011-01-24 12:56:51

标签: java windows

我想编写一个为Windows中的非Java应用程序创建输入的应用程序。使用Robot类可以很容易地生成输入,但是我需要将焦点设置到另一个应用程序的文本框并在那里输入文本。

不要担心我不是想写恶意的东西,我只是想用Java来“扩展”用Delphi编写的旧应用程序。

5 个答案:

答案 0 :(得分:9)

CMDOW是一个命令行实用程序,允许您执行各种窗口操作,如激活/停用,列出,最小化/最大化等。

或者,您可以编写VBScript来激活另一个应用程序。例如:

Set WshShell = WScript.CreateObject("WScript.Shell") 
WshShell.AppActivate("Firefox")

然后使用Java应用程序中的Runtime.exec来执行脚本。

这将帮助您激活另一个应用程序。

然而,如果你想专注于其他应用程序中的文本框并写一些文本,那将会困难得多。

答案 1 :(得分:7)

检测特殊应用程序并将其放在前面可能需要本地帮助程序,但目前您可以发送 ALT + TAB 来激活“下一个”应用

这有效:

public void switchFocus() {
  try {
    Robot r = new Robot();
    r.keyPress(KeyEvent.VK_ALT);
    r.keyPress(KeyEvent.VK_TAB);
    r.keyRelease(KeyEvent.VK_ALT);
    r.keyRelease(KeyEvent.VK_TAB);
  } catch(AWTException e) {
    // handle
  }
}

你只需要实现一个方便的方法来将字符(从字符串)映射到键事件值......(或找到一些现有的解决方案)

答案 2 :(得分:6)

配置延迟,否则无效:

Robot r = new Robot();
r.keyPress(KeyEvent.VK_ALT);
r.keyPress(KeyEvent.VK_TAB);
r.delay(10); //set the delay
r.keyRelease(KeyEvent.VK_ALT);
r.keyRelease(KeyEvent.VK_TAB);

答案 3 :(得分:1)

在Mac上,可以使用AppleScript执行此操作。 AppleScript已集成到系统中,因此它将始终可用。 https://developer.apple.com/library/content/documentation/AppleScript/Conceptual/AppleScriptLangGuide/reference/ASLR_cmds.html

您只需要检测到您是否在Mac上,并且具有该应用程序的名称。

Runtime runtime = Runtime.getRuntime();
            String[] args = { "osascript", "-e", "tell app \"Chrome\" to activate" };
            Process process = runtime.exec(args);

答案 4 :(得分:0)

您需要为应用程序添加足够的延迟以完全初始化并获得焦点。

这是一个基本的工作示例... Andreas_D是正确的,您需要模拟系统密钥以在程序之间切换...( Alt + Tab 在Windows上,OS X上的 Cmd + Tab

    import java.awt.*;
    import static java.awt.event.KeyEvent.*;
    import java.io.IOException;

    public class RobotSample {

        //https://stackoverflow.com/questions/4782231
        private static Integer[] KEY_CODES = { VK_S, VK_T, VK_A, VK_C, VK_K, VK_O, VK_V, VK_E, VK_R, VK_F, VK_L,VK_O, VK_W, VK_DECIMAL, VK_C, VK_O, VK_M, VK_SLASH, VK_Q, VK_U, VK_E, VK_S, VK_T, VK_I, VK_O, VK_N, VK_S, VK_SLASH, VK_4, VK_7, VK_8, VK_2, VK_2, VK_3, VK_1, VK_ENTER };

        public static void main( String[] args ) throws IOException {

            try {
                Robot robot = new Robot();
                Runtime runtime = Runtime.getRuntime();

                runtime.exec( "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe" );

                robot.keyPress( VK_ALT );
                robot.keyPress( VK_TAB );
                robot.keyRelease( VK_ALT );
                robot.keyRelease( VK_TAB );

                //Chill a sec...
                robot.delay( 1000 );

                for(int i = 0; i <  KEY_CODES.length; ++i) {
                    robot.keyPress( KEY_CODES[i] );
                    robot.keyRelease( KEY_CODES[i] );
                    robot.delay( 80 );
                    }

            } catch( AWTException e ) {
                e.getMessage();
            }

        }

    }