2009-03-12 11 views

Répondre

12

Examinez tous les processus et vérifiez le MainWindowTitle. (Vous pouvez utiliser des expressions rationnelles ou StartsWith, etc.)

foreach(Process proc in Process.GetProcesses()) 
{ 
    if(proc.MainWindowTitle.StartsWith("Some String")) 
    { 
     IntPtr handle = proc.MainWindowHandle; 
     // ... 
    } 
} 
+1

Intéressant. Devrait fonctionner dans la plupart des cas. Mais que se passe-t-il si un processus a plus d'une fenêtre de niveau supérieur? –

+0

@Serge: Pas exactement sûr ... –

+0

Merci! Wow, je n'ai jamais su que vous pouviez contourner cela et éviter les kludges Win32 API. – Jonas

5

This CodeProject article décrit comment énumérer les fenêtres de niveau supérieur (basé sur l'API Win32 EnumWindows). Vous pouvez facilement le modifier pour filtrer sur un titre de fenêtre partielle: Modifier EnumWindowsCallBack.

HTH.

2

Get par nom de classe et poignée de fenêtre parent. Par exemple: obtenez le bouton de démarrage en utilisant win32api. D'abord, vous connaissez le nom de classe de la fenêtre parent en utilisant l'outil spyxx.

[DllImport("user32.dll")] 
public static extern IntPtr FindWindowEx(IntPtr handleParent, IntPtr handleChild, string className, string WindowName); 
[DllImport("user32.dll")] 
public static extern IntPtr FindWindow(string className, string windowTitle); 

Utilisation:

IntPtr handle = FindWindowEx(FindWindow("Shell_TrayWnd",null), new IntPtr(0), "Button", null); 
Questions connexes