Получить HWND каждого окна?
я разрабатываю приложение python, и я хочу получить HWND
из каждого открытого окна. Мне нужно название окон и HWND
чтобы отфильтровать список для управления некоторыми специфическими окнами, перемещая и изменяя их размер.
Я попытался сделать это сам, просматривая информацию, но я не получил правильный кусок кода. Я пробовал с этим код но я получаю только название каждого окна (это здорово), но мне нужно HWND
тоже.
import ctypes
import win32gui
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((hwnd, buff.value))
return True
EnumWindows(EnumWindowsProc(foreach_window), 0)
for i in range(len(titles)):
print(titles)[i]
win32gui.MoveWindow((titles)[5][0], 0, 0, 760, 500, True)
здесь есть ошибка:
win32gui.MoveWindow((titles)[5][0], 0, 0, 760, 500, True)
TypeError: The object is not a PyHANDLE object
4 ответов
ваша проблема (теперь, когда Мартино исправил вашу первоначальную проблему не хранения HWND
значения вообще) заключается в том, что вы пытаетесь смешать ctypes
и win32gui
.
вы можете сделать это, если знаете, что делаете, но если нет, просто не делайте этого.
если вы хотите получить оконные ручки, которые можно использовать с win32gui
используйте win32gui.EnumWindows
вместо вызова функции raw из user32
DLL.
просто измените часть код для получения всех названий, поэтому он делает что-то вроде этого:
titles.append((hwnd, buff.value))
на titles
список будет тогда список кортежей, содержащих HWND и текст заголовка.
чтобы получить дескрипторы всех доступных основных окон, вы передаете 0 в win32gui.EnumChildWindows
затем проверьте, чтобы убедиться, что окно имеет текст длиной более 0 (так как вы хотите только фактические окна не скрытые/временные/всплывающие/специальные окна).