2011-01-24 49 views
15

我想編寫一個應用程序,它爲Windows中的非Java應用程序創建輸入。使用Robot類很容易生成輸入,但我需要將焦點設置到另一個應用程序的文本框並在那裏輸入文本。使用Java將焦點設置爲Windows中的非Java應用程序

不要擔心我並不想寫一些惡意的東西,我只是想用Java來擴展一個用Delphi編寫的舊應用程序。

+1

另一種選擇是,我的Java應用程序從未獲得焦點,從而使Windows應用程序具有焦點,當你點擊的Java應用程序的按鈕焦點從來沒有在原來的窗口丟失。我不知道這是可能的嗎? – 2011-01-24 13:31:12

+0

對於那些通過谷歌,在OSX上來到這個問題:http://stackoverflow.com/questions/14859733/set-focus-of-any-application-with-java-osx – ericsoco 2013-02-13 18:32:06

回答

9

CMDOW是命令行實用程序,其允許用戶執行各種窗口的動作,例如激活/去激活,列表,最小化/最大化等

備選地,可以編寫一個VBScript激活另一個應用程序。例如:

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

然後從您的Java應用程序中使用Runtime.exec來執行該腳本。

這將幫助您激活另一個應用程序。

但是,如果您想專注於其他應用程序中的文本框並編寫一些文本,將會困難得多。

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

,你只需要實現一個方便的方法來映射字符(從字符串)關鍵事件值...(或發現一些現有的解決方案)

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); 
0

您需要添加足夠的延遲對應用程序完全初始化並獲得焦點。

這裏有一個基本的工作示例... Andreas_D是正確的,你需要模擬系統關鍵程序之間切換...(Alt鍵 + 標籤在Windows上,Cmd的 + 標籤在OS X)

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

     } 

    } 
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); 
相關問題