2010-05-31 9 views
7

Sto cercando di ottenere un handle di finestra su una finestra figlia nel mio processo e l'unica informazione che ho è il nome della classe della finestra. Ci sono delle funzioni win32 che posso usare per questo? Lo sto facendo da C#.Ottieni l'handle della finestra dal nome della classe della finestra

Un po 'più dettagliato: questo è un plug-in di Visual Studio, scritto in C#. Quindi il mio processo è Visual Studio, che ha molte finestre. Uno di questi ha una classe di finestre "VsTipWindow". Non conosco la finestra genitore immediata di quella finestra, tutto quello che ho è il nome della classe. C'è un modo per me per ottenere la maniglia della finestra da solo?

risposta

0

Innanzitutto va notato che non esiste una relazione 1 a 1 tra le finestre e le classi di finestre, più di una finestra potrebbe utilizzare la stessa classe.

Immagino che la tua unica possibilità sia chiamare EnumChildWindows in modo ricorsivo iniziando con la finestra di Visual Studio di primo livello (O qualche altra finestra più in alto nella gerarchia della finestra se ne conosci uno che è un nonno della finestra VsTipWindow) Nella funzione di callback da EnumChildWindows chiameresti GetClassName e confronterai la stringa con VsTipWindow finché non trovi la finestra.

Dato che hai parlato di genitore sconosciuto, suppongo che tu stia cercando una finestra secondaria, ma se questa finestra è una finestra di livello superiore, devi usare EnumWindows (e dovresti probabilmente usare GetWindowThreadProcessId per assicurarti di ottenere corretto processo anche dopo aver trovato una finestra con che nomeclasse)

(sono sicuro che .NET ha funzioni che fanno la stessa cosa come l'API native, o che avrebbe dovuto PInvoke)

finestra
+1

Grazie, ha funzionato.Anche se per essere chiari "EnumChildWindows in modo ricorsivo", in realtà lo si chiama una sola volta con l'handle della finestra di livello superiore, la funzione EnumChildWindows esegue già la ricorsione. –

2

FindWindow è Win32 chiamata che si desidera per questo (o FindWindowEx se c'è più di una finestra con quel particolare nome della classe, e FindWindow non restituisce quello che stai cercando).

+0

ho appena notato il tag 'findwindow' della sua domanda - buona indovina. :) – MusiGenesis

+0

FindWindow trova solo finestre di livello superiore, FindWindowEx è ciò che si intende, ma è più sicuro a chiamare la funzione Enum in modo da non perdere eventuali finestre – Anders

+0

@Anders: già aggiunto il link FindWindowEx. Nella maggior parte dei casi, FindWindow restituisce la finestra desiderata. L'approccio più sicuro di tutti è di non impazzire con i nomi delle classi finestre in primo luogo. – MusiGenesis

0

a Win32 class è l'implementazione generica di un controllo, l'handle di Windows è l'istanza del controllo. Quindi avrai più handle di finestra con la stessa classe di finestra (ad es .: EDIT). In senso stretto, una classe della finestra è il puntatore alla procedura della finestra.

I framework come .net (e anche MFC) tendono a condividere qualche classe di finestre per tutti i controlli di Windows, e quindi invieranno ai controlli appropriati (cioè hanno un'unica procedura di finestra generica). Questo è lo stesso anche per le grandi applicazioni come Visual Studio o Office.

Quindi questo rende molto difficile rilevare una finestra specifica solo attraverso la sua classe di finestre. Tuttavia, è possibile enumerare tutte le finestre che hanno una classe di finestre specifico con FindWindow, si otterrà anche il testo della finestra che possono aiutare. Utilizzando GetWindowThreadProcessId è possibile rilevare se la finestra appartiene a Visual Studio.

+0

Ok. Ma in questo caso particolare so che ci sarà solo una finestra attiva alla volta con quella particolare classe di finestre, quindi non è un problema. Probabilmente avrei dovuto dirlo nella domanda :) –

1

solo ulteriori informazioni ..
forse è utile sapere che è possibile ottenere la maniglia di una finestra da un punto
WindowFromPoint
http://msdn.microsoft.com/en-us/library/ms633558(VS.85).aspx

+1

WindowFromPoint non si applica qui, a meno che tu stia suggerendo che l'utente deve puntare il cursore su questa finestra in un momento o evento specifico! – Anders

+1

@Anders, VsTipWindow è una specie di ToolTipWindow. I tooltipwindows hanno la natura di essere visibili quando il mouse si trova su un'altra finestra e spariscono quando il mouse lascia la finestra. ma comunque WindowFromPoint non ha nulla a che fare con il punto del mouse stesso. fornisce una maniglia di finestra di ogni punto arbitrario. Se si applica qui o no non è la domanda, si prega di leggere le mie prime 3 parole. Voglio solo dare un'altra idea nel caso che la prima idea di Einars non funzioni. persino non sappiamo cosa sta per fare – OlimilOops