2009-12-17 12 views
4

Comment est-ce que je peux détecter par programme si un thread a des poignées de fenêtres dessus pour un processus donné? Spy ++ ++ me donne cette information mais j'ai besoin de le faire par programmation.Comment puis-je détecter si un thread a des handles Windows?

Je dois le faire en C#, mais les bibliothèques de diagnostic .net ne me donnent pas cette information. J'imagine que spy ++ utilise des fenêtres api appel que je ne connais pas. J'ai accès au code du système que j'essaye de déboguer. Je veux incorporer périodiquement un code appelé par une minuterie qui va détecter combien de threads contiennent des fenêtres et enregistrer cette information.

grâce

Répondre

3

Je crois que vous pouvez utiliser gagnant fonctions api: EnumWindowsProc à itérer poignées de fenêtre et GetWindowThreadProcessId pour obtenir l'ID de fil et id processus associé à la poignée fenêtre donnée

S'il vous plaît vérifier si un exemple ci-dessous serait travailler pour vous:

ce code parcourt les processus et les threads à l'aide de System.Diagnostics; pour chaque ID de fil J'appelle la fonction GetWindowHandlesForThread (voir code ci-dessous)

foreach (Process procesInfo in Process.GetProcesses()) 
{ 
    Console.WriteLine("process {0} {1:x}", procesInfo.ProcessName, procesInfo.Id); 
    foreach (ProcessThread threadInfo in procesInfo.Threads) 
    { 
     Console.WriteLine("\tthread {0:x}", threadInfo.Id); 
     IntPtr[] windows = GetWindowHandlesForThread(threadInfo.Id); 
     if (windows != null && windows.Length > 0) 
      foreach (IntPtr hWnd in windows) 
       Console.WriteLine("\t\twindow {0:x}", hWnd.ToInt32()); 
    } 
} 

mise en œuvre GetWindowHandlesForThread:

private IntPtr[] GetWindowHandlesForThread(int threadHandle) 
{ 
    _results.Clear(); 
    EnumWindows(WindowEnum, threadHandle); 
    return _results.ToArray(); 
} 

private delegate int EnumWindowsProc(IntPtr hwnd, int lParam); 

[DllImport("user32.Dll")] 
private static extern int EnumWindows(EnumWindowsProc x, int y); 
[DllImport("user32.dll")] 
public static extern int GetWindowThreadProcessId(IntPtr handle, out int processId); 

private List<IntPtr> _results = new List<IntPtr>(); 

private int WindowEnum(IntPtr hWnd, int lParam) 
{   
    int processID = 0; 
    int threadID = GetWindowThreadProcessId(hWnd, out processID); 
    if (threadID == lParam) _results.Add(hWnd); 
    return 1; 
} 

résultat du code ci-dessus devraient jeter dans lissée de la console comme ceci:

... 
process chrome b70 
    thread b78 
     window 2d04c8 
     window 10354 
... 
    thread bf8 
    thread c04 
... 
+0

Merci beaucoup! C'est exactement ce dont j'avais besoin. –