복붙노트

[PYTHON] X에서 활성 창 제목 가져 오기

PYTHON

X에서 활성 창 제목 가져 오기

활성 창 제목을 얻으려고합니다. 응용 프로그램은 백그라운드 작업이므로 사용자가 Eclipse를 열면이 함수는 "Eclipse - blabla"를 반환하므로 내 자신의 창의 창 제목이 표시되지 않습니다. PyQt4를 사용하여 Python 2.6에서 이것을 개발 중입니다.

내 현재 솔루션, 빌린 약간 수정 된 그래서 여기에 늙은 대답은 다음과 같습니다 :

def get_active_window_title():
    title = ''
    root_check = ''

    root = Popen(['xprop', '-root'],  stdout=PIPE)

    if root.stdout != root_check:
        root_check = root.stdout

        for i in root.stdout:
            if '_NET_ACTIVE_WINDOW(WINDOW):' in i:
                id_ = i.split()[4]
                id_w = Popen(['xprop', '-id', id_], stdout=PIPE)

        for j in id_w.stdout:
            if 'WM_ICON_NAME(STRING)' in j:
                if title != j.split()[2]:
                    return j.split("= ")[1].strip(' \n\"')

대부분의 창문에서 작동하지만 전부는 아닙니다. 예를 들어 내 kopete 채팅 창이나 현재 개발중인 응용 프로그램의 이름을 찾을 수 없습니다.

내 다음 시도는 다음과 같습니다.

def get_active_window_title(self):
    screen = wnck.screen_get_default()
    if screen == None:
        return "Could not get screen"
    window = screen.get_active_window()
    if window == None:
        return "Could not get window"
    title = window.get_name()
    return title;

그러나 어떤 이유로 창은 항상 없음입니다.

누군가 현재 창 제목을 얻는 더 좋은 방법을 가지고 있습니까, 아니면 모든 창에서 작동하는 방식 중 하나를 수정하는 방법이 있습니까?

편집하다:

누군가가 궁금해하는 경우에 이것이 모든 창에서 작동하는 것으로 보이는 방법입니다.

def get_active_window_title(self):
    root_check = ''
    root = Popen(['xprop', '-root'],  stdout=PIPE)

    if root.stdout != root_check:
        root_check = root.stdout

        for i in root.stdout:
            if '_NET_ACTIVE_WINDOW(WINDOW):' in i:
                id_ = i.split()[4]
                id_w = Popen(['xprop', '-id', id_], stdout=PIPE)
        id_w.wait()
        buff = []
        for j in id_w.stdout:
            buff.append(j)

        for line in buff:
            match = re.match("WM_NAME\((?P<type>.+)\) = (?P<name>.+)", line)
            if match != None:
                type = match.group("type")
                if type == "STRING" or type == "COMPOUND_TEXT":
                    return match.group("name")
        return "Active window not found"

해결법

  1. ==============================

    1.xdotool이 그렇게 할 수 있습니다.

    xdotool이 그렇게 할 수 있습니다.

    xdotool getactivewindow

  2. ==============================

    2.솔루션을 약간 수정하여보다 효율적으로 실행해야합니다 (xprop에 매개 변수를 전달하므로 필요한 데이터 만 반환 됨). 또한 xprop의 출력을 버퍼링 할 필요가 있는지 확신 할 수 없으므로이를 제거했습니다. 어떤 이유로 액티브 윈도우를 찾을 수없는 경우 "액티브 윈도우를 찾을 수 없음"도 반환해야합니다.

    솔루션을 약간 수정하여보다 효율적으로 실행해야합니다 (xprop에 매개 변수를 전달하므로 필요한 데이터 만 반환 됨). 또한 xprop의 출력을 버퍼링 할 필요가 있는지 확신 할 수 없으므로이를 제거했습니다. 어떤 이유로 액티브 윈도우를 찾을 수없는 경우 "액티브 윈도우를 찾을 수 없음"도 반환해야합니다.

    def get_active_window_title(self):
        root = Popen(['xprop', '-root', '_NET_ACTIVE_WINDOW'], stdout=PIPE)
    
        for line in root.stdout:
            m = re.search('^_NET_ACTIVE_WINDOW.* ([\w]+)$', line)
            if m != None:
                id_ = m.group(1)
                id_w = Popen(['xprop', '-id', id_, 'WM_NAME'], stdout=PIPE)
                break
    
        if id_w != None:
            for line in id_w.stdout:
                match = re.match("WM_NAME\(\w+\) = (?P<name>.+)$", line)
                if match != None:
                    return match.group("name")
    
        return "Active window not found"
    
  3. ==============================

    3.xdotool을 사용하여 활성 창 제목을 가져올 수 있습니다.

    xdotool을 사용하여 활성 창 제목을 가져올 수 있습니다.

    $ xdotool getactivewindow getwindowname
    
  4. from https://stackoverflow.com/questions/3983946/get-active-window-title-in-x by cc-by-sa and MIT license