Obtenir HWND de chaque Fenêtre?
Je développe une application en python et je veux obtenir le HWND
de chaque ouverture de windows. J'ai besoin du nom de windows et le HWND
pour filtrer la liste pour gérer certaines spécificités de windows, le déplacement et le redimensionnement.
J'ai essayé de le faire moi même à la recherche d'informations autour de lui, mais je n'ai pas le bon morceau de code. J'ai essayé avec ce code mais je ne reçois que le titre de chaque windows (qui est grand), mais j'ai besoin de la HWND
trop.
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)
Il y a une erreur ici:
win32gui.MoveWindow((titles)[5][0], 0, 0, 760, 500, True)
TypeError: The object is not a PyHANDLE object
DONC, n'est pas un supermarché où vous pouvez aller avec une liste de courses et laissez les autres en faire votre travail pour vous. Qu'avez-vous fait vous-même?
J'ai essayé de le faire moi même à la recherche d'informations autour de lui, mais je n'ai pas le bon morceau de code. J'ai essayé avec ce sjohannes.wordpress.com/2012/03/23/... mais je ne reçois que le titre de chaque windows (qui est grand), mais j'ai besoin de le HWND trop.
Ce que moi, c'est le cas, veuillez post code vous avez écrit (soit basé sur ce que vous avez trouvé, ou même copié) avec erreurs vous avez reçu ou d'autres choses que vous avez fait.
Merci de ne pas modifier votre question à inclure les correctifs de la réponse, parce que cela rend votre question inutile pour quelqu'un qui vient plus tard et veut comprendre.
J'ai essayé de le faire moi même à la recherche d'informations autour de lui, mais je n'ai pas le bon morceau de code. J'ai essayé avec ce sjohannes.wordpress.com/2012/03/23/... mais je ne reçois que le titre de chaque windows (qui est grand), mais j'ai besoin de le HWND trop.
Ce que moi, c'est le cas, veuillez post code vous avez écrit (soit basé sur ce que vous avez trouvé, ou même copié) avec erreurs vous avez reçu ou d'autres choses que vous avez fait.
Merci de ne pas modifier votre question à inclure les correctifs de la réponse, parce que cela rend votre question inutile pour quelqu'un qui vient plus tard et veut comprendre.
OriginalL'auteur user1618465 | 2013-02-01
Vous devez vous connecter pour publier un commentaire.
Vous mélangé
ctypes
etwin32gui
.Le
hwnd
que vous avez est obtenu par l'intermédiaire d'ctypes
et est unLP_c_long
objet. C'est pourquoiwin32gui.MoveWindow
n'ai pas l'accepter. Vous devriez passer àSi vous souhaitez utiliser
win32gui.MoveWindow
, vous pouvez utiliser la fonction python que le rappel directement.Par exemple,
OriginalL'auteur nymk
Votre problème (maintenant que martineau a résolu votre problème d'origine de ne pas stocker le
HWND
valeurs à tous), c'est que vous êtes en train de mélangerctypes
etwin32gui
.Vous pouvez le faire si vous savez ce que vous faites, mais si non, il suffit de ne pas le faire.
Si vous souhaitez obtenir des poignées de fenêtre que vous pouvez utiliser avec
win32gui
, utilisezwin32gui.EnumWindows
au lieu d'appeler la fonction raw de lauser32
DLL.OriginalL'auteur abarnert
Pour obtenir les poignées de toutes les fenêtres principales vous passer de 0 à
win32gui.EnumChildWindows
alors assurez-vous que la fenêtre de texte de longueur de plus de 0 (puisque vous ne souhaitez que windows pas caché/temporaire/popup/windows).OriginalL'auteur Add the Ice
Modifier juste le morceau de code pour obtenir tous les titres de sorte qu'il n'quelque chose comme ceci:
La
titles
liste sera ensuite une liste de tuples contenant le HWND et le texte du titre.J'ai mis à jour le post avec votre aide. Mais je ne peux pas utiliser le HWND de valeurs dans la win32gui.MoveWindow() fonction. Pourquoi?
En théorie, vous devriez être en mesure d'utiliser
hwnd.contents.value
pour obtenir la valeur de l'entier, mais sur mon système se bloque pour des raisons inconnues. Le problème est que vous êtes de mélangectypes
PyHANDLE
etwin32
c_long
types. Je pense que @abarnert a la bonne idée de ne pas les mélanger.OriginalL'auteur martineau