2009-04-28 21 views
7

La documentación de Microsoft WinAPI parece sugerir que user32.dll contiene una función llamada GetNextWindow() que supuestamente permite enumerar las ventanas abiertas en su orden Z llamando a esta función repetidamente.¿Cómo puedo usar GetNextWindow() en C#?

Pinvoke generalmente me da la declaración necesaria DllImport para usar las funciones de WinAPI desde C#. Sin embargo, para GetNextWindow() no tiene una entrada. Así que traté de construir mi propia:

[DllImport("user32.dll")] 
static extern IntPtr GetNextWindow(IntPtr hWnd, uint wCmd); 

Por desgracia, cuando se trata de llamar a esto, me sale un EntryPointNotFoundException diciendo:

Unable to find an entry point named 'GetNextWindow' in DLL 'user32.dll'. 

Esto parece aplicarse solamente a GetNextWindow(); otras funciones que se enumeran en Pinvoke están bien. Puedo llamar al GetTopWindow() y GetWindowText() sin lanzar una excepción.

Por supuesto, si puede sugerir una forma completamente diferente de enumerar ventanas en su orden Z actual, me alegra escuchar eso también.

Respuesta

24

GetNextWindow() es en realidad una macro para GetWindow(), en lugar de un método de API real. Es por compatibilidad con la API Win16.

[DllImport("user32.dll", SetLastError = true)] 
static extern IntPtr GetWindow(IntPtr hWnd, uint uCmd); 

enum GetWindow_Cmd : uint { 
    GW_HWNDFIRST = 0, 
    GW_HWNDLAST = 1, 
    GW_HWNDNEXT = 2, 
    GW_HWNDPREV = 3, 
    GW_OWNER = 4, 
    GW_CHILD = 5, 
    GW_ENABLEDPOPUP = 6 
} 

(De Pinvoke.net)

+1

derecho. Y este hilo (http://social.msdn.microsoft.com/Forums/en-US/vbgeneral/thread/afa69b03-5425-4124-b9b4-f8c6cb9bcc9c) muestra cómo usarlo para obtener "siguiente" – hometoast

+0

Brillante, gracias ¡cargas! – Timwi

+0

¿Cuál es el punto de GetNextWindow() además de confundir pinvokers pobres si toma los mismos argumentos que GetWindow() entonces? – Traubenfuchs

2

GetNextWindow ++ es una macro que llama c GetWindow, por lo que no se puede llamar desde .NET. Llame a GetWindow en su lugar.

De MSDN:

El uso de esta función es el mismo que llamar a la función GetWindow con la bandera GW_HWNDNEXT o GW_HWNDPREV establecer