假設我在eclipse中運行我的程序,它將切換到mozilla窗口(它正在同時運行)。同樣,當我們點擊任務欄中的圖標時。我已經嘗試過Robot類來激發點擊,但這是硬編碼座標到程序中,我不想這樣做。如何在使用java的runnng windows應用程序之間切換?
任何建議如何我可以做到這一點。謝謝。
假設我在eclipse中運行我的程序,它將切換到mozilla窗口(它正在同時運行)。同樣,當我們點擊任務欄中的圖標時。我已經嘗試過Robot類來激發點擊,但這是硬編碼座標到程序中,我不想這樣做。如何在使用java的runnng windows應用程序之間切換?
任何建議如何我可以做到這一點。謝謝。
我相信你的問題可能已經在這裏回答:Active other process's window in Java。
除此之外,JNA將是您最好的選擇,核心Java或Java通常不允許 直接與操作系統進行交互,但JNA會這樣做。
唯一的其他辦法,我能想到的是調用應用程序,例如用命令鉻像論點
try{
Desktop.getDesktop().open(new File("Location\\to\\the\\program.exe"));
} catch(IOException ex){
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
編輯(如果需要的話):
使用這種方法來調用它帶參數
Process process = new ProcessBuilder("Location\\to\\the\\program.exe",
"param1","param2").start();
據我瞭解,你不能通過使用核心Java的名稱切換到另一個正在運行的窗口。您可以通過通過機器人發送alt-tab鍵來切換窗口,但這不會顯示命名窗口。爲此,我建議使用JNI,JNA或某種操作系統特定的實用程序編程語言,例如AutoIt(如果這是Windows問題)。
例如,使用JNA,你可以做這樣的事情:
import com.sun.jna.Native;
import com.sun.jna.Pointer;
import com.sun.jna.win32.StdCallLibrary;
public class SetForgroundWindowUtil {
public interface User32 extends StdCallLibrary {
User32 INSTANCE = (User32) Native.loadLibrary("user32", User32.class);
interface WNDENUMPROC extends StdCallCallback {
boolean callback(Pointer hWnd, Pointer arg);
}
boolean EnumWindows(WNDENUMPROC lpEnumFunc, Pointer arg);
int GetWindowTextA(Pointer hWnd, byte[] lpString, int nMaxCount);
int SetForegroundWindow(Pointer hWnd);
Pointer GetForegroundWindow();
}
public static boolean setForegroundWindowByName(final String windowName,
final boolean starting) {
final User32 user32 = User32.INSTANCE;
return user32.EnumWindows(new User32.WNDENUMPROC() {
@Override
public boolean callback(Pointer hWnd, Pointer arg) {
byte[] windowText = new byte[512];
user32.GetWindowTextA(hWnd, windowText, 512);
String wText = Native.toString(windowText);
// if (wText.contains(WINDOW_TEXT_TO_FIND)) {
if (starting) {
if (wText.startsWith(windowName)) {
user32.SetForegroundWindow(hWnd);
return false;
}
} else {
if (wText.contains(windowName)) {
user32.SetForegroundWindow(hWnd);
return false;
}
}
return true;
}
}, null);
}
public static void main(String[] args) {
boolean result = setForegroundWindowByName("Untitled", true);
System.out.println("result: " + result);
}
}
我不知道解決這個問題的任何操作系統無關的方式。
謝謝,是的,你是對的我不能使用Alt + Tab(因爲標籤序列是未知的)。我想我必須看看JNA。 – Tairman 2014-09-01 06:27:40
我已經使用JNA或將我的Java程序與Windows實用程序編程語言(如AutoIt)鏈接。 – 2014-08-30 12:16:56