Ottenere HWND di ogni Finestra?

Sto sviluppando un applicazione python e voglio ottenere il HWND di ogni apertura di windows. Mi serve il nome di windows e il HWND per filtrare l’elenco per gestire alcuni aspetti di windows, lo spostamento e il ridimensionamento.

Ho provato a farlo io, cercando informazioni in giro ma non ho ottenere il giusto pezzo di codice. Ho provato con questo codice ma mi arriva solo il titolo di ogni windows (che è grande), ma ho bisogno di HWND troppo.

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)

C’è un errore qui:

win32gui.MoveWindow((titles)[5][0], 0, 0, 760, 500, True)
 TypeError: The object is not a PyHANDLE object
QUINDI non è un supermercato dove si può andare con una lista della spesa e lasciare gli altri a fare il lavoro per voi. Cosa avete fatto voi?
Ho provato a farlo io, cercando informazioni in giro ma non ho ottenere il giusto pezzo di codice. Ho provato con questo sjohannes.wordpress.com/2012/03/23/… ma mi arriva solo il titolo di ogni windows (che è grande), ma ho bisogno di HWND troppo.
Che cosa mi significa, si prega di post codice che hai scritto (in base a quello che avete trovato, o addirittura copiato) con il errori hai ricevuto o altre cose che hai fatto.
Si prega di non modificare la tua domanda per includere le correzioni da la risposta, perché è questo che fa la tua domanda inutile per chi arriva più tardi e che vuole capire.

OriginaleL’autore user1618465 | 2013-02-01

4 risposte

  1. 19

    È mescolato ctypes e win32gui.

    Il hwnd hai ottenuto via ctypes ed è un LP_c_long oggetto. Ecco perché win32gui.MoveWindow non lo accetti. Si dovrebbe passare a

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

    Se si desidera utilizzare win32gui.MoveWindow, è possibile utilizzare la funzione python come richiamata direttamente.
    Per esempio,

    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)
    grande risposta!!! fatto la mia finestra del browser saltare su tre monitor 😀

    OriginaleL’autore nymk

  2. 2

    Il tuo problema (ora che martineau ha risolto il tuo problema originale di non archiviare il HWND i valori a tutti) è che stai cercando di mescolare ctypes e win32gui.

    Si può fare che se si sa cosa si sta facendo—ma se non, basta non farlo.

    Se si desidera ottenere l’handle della finestra che è possibile utilizzare con win32gui, utilizzare win32gui.EnumWindows invece di chiamare il raw funzione di fuori del user32 DLL.

    OriginaleL’autore abarnert

  3. 1

    Per ottenere le maniglie di tutte le finestre principali, si passa da 0 a win32gui.EnumChildWindows quindi controllare per assicurarsi che la finestra di testo di lunghezza più di 0 (visto che vuoi solo attuale di windows non nascosto/temporaneo/popup/speciali di windows).

    OriginaleL’autore Add the Ice

  4. 1

    Basta modificare il pezzo di codice per ottenere tutti i titoli in modo da fa qualcosa di simile a questo:

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

    Il titles elenco sarà quindi una lista di tuple contenenti l’HWND e il titolo del testo.

    Ti ringrazio molto, ma è questo che succede: (<__main__.LP_c_long oggetto 0x022A9030>, u’Spotify’) ottengo la int che poi userò con win32gui.MoveWindow(hwnd, 0, 0, 760, 500, True). Come posso ottenere questo numero???
    Ho aggiornato il post con il vostro aiuto. Ma non posso utilizzare la HWND valori in win32gui.MoveWindow() funzione. Perché?
    In teoria si dovrebbe essere in grado di utilizzare hwnd.contents.value per ottenere il valore intero, ma sul mio sistema che si blocca per motivi sconosciuti. Il problema è che sei di miscelazione ctypes PyHANDLE e win32 c_long tipi. Penso che @abarnert ha l’idea giusta per evitare di confonderli.

    OriginaleL’autore martineau

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *