Get HWND of each Window?

匿名 (未验证) 提交于 2019-12-03 02:29:01

问题:

I am developing a python application and I want to get the HWND of each open windows. I need the name of the windows and the HWND to filter the list to manage some specifics windows, moving and resizing them.

I have tried to do it myself looking information around but I did not get the correct piece of code. I tried with this code but I only get the title of each windows (that is great), but I need the HWND too.

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) 

There is a error here:

win32gui.MoveWindow((titles)[5][0], 0, 0, 760, 500, True)  TypeError: The object is not a PyHANDLE object 

回答1:

You mixed up ctypes and win32gui.
The hwnd you've got is obtained via ctypes and is a LP_c_long object. That's why win32gui.MoveWindow didn't accept it. You should pass it to

ctypes.windll.user32.MoveWindow(titles[5][0], 0, 0, 760, 500, True) 

If you want to use win32gui.MoveWindow, you can use python function as callback directly.
For example,

import win32gui  def enumHandler(hwnd, lParam):     if win32gui.IsWindowVisible(hwnd):         if 'Stack Overflow' in win32gui.GetWindowText(hwnd):             win32gui.MoveWindow(hwnd, 0, 0, 760, 500, True)  win32gui.EnumWindows(enumHandler, None) 


回答2:

Your problem (now that martineau has fixed your original problem of not storing the HWND values at all) is that you're trying to mix ctypes and win32gui.

You can do that if you know what you're doing―but if not, just don't do it.

If you want to get window handles you can use with win32gui, use win32gui.EnumWindows instead of calling the raw function out of the user32 DLL.



回答3:

Just modify the piece of code for getting all titles so it does something like this:

titles.append((hwnd, buff.value)) 

The titles list will then be a list of tuples containing the HWND and the title text.



回答4:

To get the handles of all available main windows you pass 0 to win32gui.EnumChildWindows then check to make sure the window has text of length longer than 0 (since you want only actual windows not hidden/temporary/popup/special windows).



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!