Получить название окна другой программы, используя имя процесса

Этот вопрос, вероятно, довольно простой, но мне сложно его взломать. Я предполагаю, что мне нужно будет что-то использовать в ctypes.windll.user32 . Имейте в виду, что у меня мало опыта использования этих библиотек или даже ctypes в целом.

Я использовал этот код для отображения всех названий окон, но я понятия не имею, как я должен изменить этот код, чтобы получить заголовок окна с именем процесса:

 import ctypes EnumWindows = ctypes.windll.user32.EnumWindows EnumWindowsProc = ctypes.WINFUNCTYPE(ctypes.c_bool, ctypes.POINTER(ctypes.c_int), ctypes.POINTER(ctypes.c_int)) GetWindowText = ctypes.windll.user32.GetWindowTextW GetWindowTextLength = ctypes.windll.user32.GetWindowTextLengthW IsWindowVisible = ctypes.windll.user32.IsWindowVisible titles = [] def foreach_window(hwnd, lParam): if IsWindowVisible(hwnd): length = GetWindowTextLength(hwnd) buff = ctypes.create_unicode_buffer(length + 1) GetWindowText(hwnd, buff, length + 1) titles.append(buff.value) return True EnumWindows(EnumWindowsProc(foreach_window), 0) print(titles) 

Этот код от https://sjohannes.wordpress.com/2012/03/23/win32-python-getting-all-window-titles/

Если мой вопрос неясен, я хотел бы добиться чего-то подобного (просто пример – я не спрашиваю конкретно о Spotify):

 getTitleOfWindowbyProcessName("spotify.exe") // returns "Avicii - Waiting For Love" (or whatever the title is) 

Усложнение, которое может возникнуть, если несколько окон работают с одним и тем же именем процесса (например, с несколькими хромированными окнами)

Спасибо.


EDIT : Чтобы уточнить, мне нужен какой-то код, который принимает имя процесса и возвращает (возможно, пустой) список названий окон, принадлежащих этому процессу, в виде строк.

Вот что я имел в виду в комментарии:

 import win32gui def enumWindowsProc(hwnd, lParam): print win32gui.GetWindowText(hwnd) win32gui.EnumWindows(enumWindowsProc, 0) 

Ниже я вложил все это … он не работает на ПК, который я сейчас, так как я перепутал с настройками безопасности (это XP !!!), и я получаю кучу Access denied (ошибка код: 5 ) ошибки, но вот он:

 import sys import os import traceback import ctypes from ctypes import wintypes import win32con import win32api import win32gui import win32process def enumWindowsProc(hwnd, lParam): if (lParam is None) or ((lParam is not None) and (win32process.GetWindowThreadProcessId(hwnd)[1] == lParam)): text = win32gui.GetWindowText(hwnd) if text: wStyle = win32api.GetWindowLong(hwnd, win32con.GWL_STYLE) if wStyle & win32con.WS_VISIBLE: print("%08X - %s" % (hwnd, text)) def enumProcWnds(pid=None): win32gui.EnumWindows(enumWindowsProc, pid) def enumProcs(procName=None): pids = win32process.EnumProcesses() if procName is not None: bufLen = 0x100 bytes = wintypes.DWORD(bufLen) _OpenProcess = ctypes.cdll.kernel32.OpenProcess _GetProcessImageFileName = ctypes.cdll.psapi.GetProcessImageFileNameA _CloseHandle = ctypes.cdll.kernel32.CloseHandle filteredPids = () for pid in pids: try: hProc = _OpenProcess(wintypes.DWORD(win32con.PROCESS_ALL_ACCESS), ctypes.c_int(0), wintypes.DWORD(pid)) except: print("Process [%d] couldn't be opened: %s" % (pid, traceback.format_exc())) continue try: buf = ctypes.create_string_buffer(bufLen) _GetProcessImageFileName(hProc, ctypes.pointer(buf), ctypes.pointer(bytes)) if buf.value: name = buf.value.decode().split(os.path.sep)[-1] #print name else: _CloseHandle(hProc) continue except: print("Error getting process name: %s" % traceback.format_exc()) _CloseHandle(hProc) continue if name.lower() == procName.lower(): filteredPids += (pid,) return filteredPids else: return pids def main(args): if args: procName = args[0] else: procName = None pids = enumProcs(procName) print(pids) for pid in pids: enumProcWnds(pid) if __name__ == "__main__": main(sys.argv[1:]) 

Излишне говорить, что:

  • Чтобы этот код работал, вам нужно запустить его как привилегированный пользователь (администратор); требуется, по крайней мере, SeDebugPrivilege .
  • Могут быть сюрпризы, когда процессы выполняются в режимах 32/64 бит (процесс python , из которого выполняется этот код, и целевые процессы, перечисленные в коде)