2009-04-28 4 views
7

La documentation Microsoft WinAPI semble suggérer que user32.dll contient une fonction appelée GetNextWindow() qui permet soi-disant d'énumérer les fenêtres ouvertes dans leur ordre Z en appelant cette fonction plusieurs fois.Comment puis-je utiliser GetNextWindow() en C#?

Pinvoke me donne généralement l'instruction DllImport nécessaire pour utiliser les fonctions WinAPI de C#. Cependant, pour GetNextWindow() il n'a pas d'entrée. J'ai donc essayé de construire mon propre:

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

Malheureusement, en essayant d'appeler cela, je reçois un EntryPointNotFoundException disant:

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

Cela semble s'appliquer uniquement aux GetNextWindow(); Les autres fonctions listées sur Pinvoke sont correctes. Je peux appeler GetTopWindow() et GetWindowText() sans lever une exception.

Bien sûr, si vous pouvez proposer une manière complètement différente d'énumérer des fenêtres dans leur ordre Z actuel, je suis heureux d'entendre cela aussi.

Répondre

24

GetNextWindow() est en fait une macro pour GetWindow(), plutôt qu'une méthode API réelle. C'est pour la rétrocompatibilité avec l'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

droit. Et ce fil (http://social.msdn.microsoft.com/Forums/en-US/vbgeneral/thread/afa69b03-5425-4124-b9b4-f8c6cb9bcc9c) montre comment l'utiliser pour obtenir "prochaine" – hometoast

+0

Brillant, merci vous charge! – Timwi

+0

Quel est le point de GetNextWindow() en plus de confondre les pinvokers pauvres s'il prend les mêmes arguments que GetWindow() alors? – Traubenfuchs

2

GetNextWindow est un C++ macro qui appelle GetWindow, de sorte que vous ne pouvez pas l'appeler de .NET. Appelez plutôt GetWindow.

De MSDN:

Cette fonction est la même chose que d'appeler la fonction GetWindow avec le drapeau GW_HWNDNEXT ou GW_HWNDPREV mis

Questions connexes