Domanda

Sto costruendo un'app che ha dato a un'altra app mainWindowhandle che raccoglie informazioni sullo stato della finestra. Non ho problemi a raccogliere informazioni sulle finestre secondarie, ma non riesco ad accedere alle altre finestre aperte di un'applicazione o ai menu. Esiste un modo per ottenere tutti gli handle di finestra di un'applicazione?

È stato utile?

Soluzione

Potresti fare ciò che Process.MainWindowHandle sembra: usare P / Invoke per chiamare EnumWindows , che richiama un metodo di callback per ogni finestra di livello superiore nel sistema.

Nel callback, chiama GetWindowThreadProcessId , e confronta l'id di processo della finestra con Process.Id ; se gli ID processo corrispondono, aggiungi l'handle della finestra a un elenco.

Altri suggerimenti

Per prima cosa, devi ottenere il manico della finestra della finestra principale dell'applicazione.

 [DllImport("user32.dll", SetLastError = true)]
 static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

 IntPtr hWnd = (IntPtr)FindWindow(windowName, null);

Quindi, puoi usare questo handle per ottenere tutte le finestre dei bambini:

[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool EnumChildWindows(IntPtr hwndParent, EnumWindowsProc lpEnumFunc, IntPtr lParam);

private List<IntPtr> GetChildWindows(IntPtr parent)  
{  
    List<IntPtr> result = new List<IntPtr>();  
    GCHandle listHandle = GCHandle.Alloc(result);  
    try  
    {  
         EnumWindowProc childProc = new EnumWindowProc(EnumWindow);  
         EnumChildWindows(parent, childProc, GCHandle.ToIntPtr(listHandle));  
    }  
    finally  
    {  
         if (listHandle.IsAllocated)  
               listHandle.Free();  
    }  
    return result;  
}   
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top