Подтвердить что ты не робот

Получить текущее активное название окна в Java

Я пытаюсь написать программу Java, которая регистрирует, какое приложение я использую каждые 5 секунд (это приложение для отслеживания времени). Мне нужно каким-то образом узнать, что такое текущее активное окно. Я нашел KeyboardFocusManager.getGlobalActiveWindow(), но я не могу заставить его работать правильно. Преимущество кросс-платформенного решения, но если его не существует, то я разрабатываю для linux с X.Org. Спасибо.

4b9b3361

Ответ 1

Я совершенно уверен, что вы не найдете возможности перечислить активные окна в чистой Java (раньше я выглядел довольно сложно), поэтому вам нужно будет скопировать платформы, на которые вы хотите настроить таргетинг.

  • В Mac OS X вы можете запустить AppleScript с помощью "osascript".

  • В X11 вы можете использовать xwininfo.

  • В Windows вы можете запустить VBScript (например, эта ссылка выглядит многообещающей).

Если вы используете SWT, вы можете найти некоторые недокументированные, непубличные методы в SWT-библиотеках, поскольку SWT предоставляет обертки для большого количества OS API (например, SWT на Cocoa имеет org.eclipse.swt.internal.cocoa.OS#objc_msgSend() методы, которые можно использовать для доступа к ОС). Эквивалентные классы ОС для Windows и X11 могут иметь API, который вы можете использовать.

Ответ 2

Я написал java-программу, используя user361601 script. Надеюсь, это поможет другим.

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class WindowAndProcessInfo4Linux {

public static final String WIN_ID_CMD = "xprop -root | grep " + "\"_NET_ACTIVE_WINDOW(WINDOW)\"" + "|cut -d ' ' -f 5";
public static final String WIN_INFO_CMD_PREFIX = "xwininfo -id ";
public static final String WIN_INFO_CMD_MID = " |awk \'BEGIN {FS=\"\\\"\"}/xwininfo: Window id/{print $2}\' | sed \'s/-[^-]*$//g\'";

public String execShellCmd(String cmd){
    try {  

        Runtime runtime = Runtime.getRuntime();  
        Process process = runtime.exec(new String[] { "/bin/bash", "-c", cmd });  
        int exitValue = process.waitFor();  
        System.out.println("exit value: " + exitValue);  
        BufferedReader buf = new BufferedReader(new InputStreamReader(process.getInputStream()));  
        String line = "";  
        String output = "";
        while ((line = buf.readLine()) != null) {
            output = line;
        }
        return output;
    } catch (Exception e) {  
        System.out.println(e);
        return null;
    }  
}

public String windowInfoCmd(String winId){
    if(null!=winId && !"".equalsIgnoreCase(winId)){
        return WIN_INFO_CMD_PREFIX+winId +WIN_INFO_CMD_MID;
    }
    return null;
}

public static void main (String [] args){
    WindowAndProcessInfo4Linux windowAndProcessInfo4Linux = new WindowAndProcessInfo4Linux();
    try {
        Thread.sleep(4000);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    String winId = windowAndProcessInfo4Linux.execShellCmd(WIN_ID_CMD);
    String winInfoMcd = windowAndProcessInfo4Linux.windowInfoCmd(winId);
    String windowTitle = windowAndProcessInfo4Linux.execShellCmd(winInfoMcd);
    System.out.println("window title is: "+ windowTitle);

}
}

//поток thread.sleep существует, чтобы вы могли переключиться в другое окно:) Кроме того, вы можете использовать кварц из spring, чтобы запланировать его.

Ответ 3

Чтобы найти активное окно (будь то кадр или диалог) в приложении java swing, вы можете использовать следующий рекурсивный метод:

Window getSelectedWindow(Window[] windows) {
    Window result = null;
    for (int i = 0; i < windows.length; i++) {
        Window window = windows[i];
        if (window.isActive()) {
            result = window;
        } else {
            Window[] ownedWindows = window.getOwnedWindows();
            if (ownedWindows != null) {
                result = getSelectedWindow(ownedWindows);
            }
        }
    }
    return result;
}

это от здесь Дополнительные сведения о состоянии окна здесь.

Ответ 4

Я написал bash script, который регистрирует текущее активное окно: http://www.whitelamp.com/public/active-window-logger.html Он использует исправленную версию wmctrl, но предоставляет подробную информацию о альтернативный (более медленный) метод с использованием xprop и xwininfo.

Ссылки на патч wmctrl и исходный код и script могут быть найденные выше.

Ответ 5

Я создал этот applescript при поиске в подобной теме - этот получает конкретный размер окна

global theSBounds

tell application "System Events"
	set this_info to {}
	set theSBounds to {}
	repeat with theProcess in processes
		if not background only of theProcess then
			tell theProcess
				set processName to name
				set theWindows to windows
			end tell
			set windowsCount to count of theWindows
			
			if processName contains "xxxxxxxx" then
				set this_info to this_info & processName
				
			else if processName is not "Finder" then
				if windowsCount is greater than 0 then
					repeat with theWindow in theWindows
						tell theProcess
							tell theWindow
								if (value of attribute "AXTitle") contains "Genymotion for personal use -" then
									-- set this_info to this_info & (value of attribute "AXTitle")
									set the props to get the properties of the theWindow
									set theSBounds to {size, position} of props
									set this_info to this_info & theSBounds
								end if
							end tell
						end tell
					end repeat
				end if
			end if
		end if
	end repeat
end tell
return theSBounds