我想写一个为Windows中的非Java应用程序创buildinput的应用程序。 使用Robot类很容易生成input,但是我需要将焦点设置到另一个应用程序的文本框并在那里input文本。
不要担心,我不会试图写一些恶意的东西,我只是想用Java来“扩展”一个用Delphi编写的旧应用程序。
CMDOW是一个命令行实用程序,它允许您执行各种窗口操作,如激活/停用,列表,最小化/最大化等。
或者 ,您可以编写一个VBScript来激活另一个应用程序。 例如:
Set WshShell = WScript.CreateObject("WScript.Shell") WshShell.AppActivate("Firefox")
然后使用Java应用程序中的Runtime.exec
来执行脚本。
这将帮助您激活另一个应用程序。
但是 ,如果您想要专注于其他应用程序中的文本框并编写一些文本,将会变得更加困难。
检测一个特殊的应用程序,并把它放在前面可能需要一个本地帮助器,但是暂时你可以发送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 } }
你只需要实现一个方便的方法来映射字符(从字符串)到关键事件值(或找到一些现有的解决方案)
配置一个延迟,否则将无法正常工作:
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);
在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);
您需要为应用程序添加足够的延迟才能完全初始化并获得焦点。
这里有一个基本的工作示例… Andreas_D是正确的,你需要模拟系统键来切换程序…(在Windows上的Alt + Tab ,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(); } } }