Laden...

Fenster eines Prozesses ermitteln

Erstellt von pollito vor 6 Jahren Letzter Beitrag vor 6 Jahren 1.515 Views
pollito Themenstarter:in
314 Beiträge seit 2010
vor 6 Jahren
Fenster eines Prozesses ermitteln

Hallo!

Wenn ich mir unter Windows 10 den Taskmanager anschaue, sehe ich im ersten Reiter die geladenen Prozesse. Klappe ich einen Prozess auf, sehe ich die unterschiedlichen Fenster des Prozesses.

Wie kann ich die geöffneten Fenster eines Prozesses auflisten bzw. auf Sie zugreifen um z. B. eins in den Vordergrund zu bringen?

Bevor ich das mit beispielsweise "EnumWindows" versuche, würde ich gerne wissen, ob es eine entsprechende .NET-Alternative gibt.

Vielen Dank und liebe Grüße!

René

16.842 Beiträge seit 2008
vor 6 Jahren

Die Process-Klasse hat eine Property Namens MainWindowHandle
Wenn ich Dich richtig verstehe, dann suchst Du das.

Je nachdem was Du tun willst, dann brauchst Du aber die Win32 API.
.NET ist an dieser Stelle ohnehin nur ein Wrapper; aber .NET wrappt an dieser Stelle nur sehr wenig Funktionalität der Win32 ab..

Ansonsten hättest Du sicherlich bei einer Google Recherche fertige Snippets hierzu bekommen.
Auch hier im Forum hatten wir das Thema nicht nur ein Mal.

pollito Themenstarter:in
314 Beiträge seit 2010
vor 6 Jahren

Danke! Ich möchte alle zu einem Prozess gehörenden Fenster ermitteln und eines davon in den Vordergrund bringen.

Ich habe in der Tat viele Beispiele gefunden, allerdings hoffte ich, dass .NET mir die Funktionalität liefert, ohne auf die Win32-API zurückgreifen zu müssen. Wie es aussieht, ist das nicht so. Auch diese Erkenntnis hilft mir weiter.

René

16.842 Beiträge seit 2008
vor 6 Jahren

allerdings hoffte ich, dass .NET mir die Funktionalität liefert

Dazu reicht ja ein Blick in die Doku. Dafür ist sie da.

2.921 Beiträge seit 2005
vor 6 Jahren

Oft wird wenn das WARUM? bekannt ist, eine andere Lösung gegeben,
die auch öfter passen mag.

Falls nicht,
kann auch das funktionieren (hatte ich mal irgendwoher kopiert, finde es gerade aber nicht mehr in Google, sonst würde ich die Source angeben:


delegate bool EnumThreadDelegate(IntPtr hWnd, IntPtr lParam);

[DllImport("user32.dll")]
static extern bool EnumThreadWindows(int dwThreadId, EnumThreadDelegate lpfn,
    IntPtr lParam);

static IEnumerable<IntPtr> EnumerateProcessWindowHandles(int processId)
{
    var handles = new List<IntPtr>();

    foreach (ProcessThread thread in Process.GetProcessById(processId).Threads)
        EnumThreadWindows(thread.Id, 
            (hWnd, lParam) => { handles.Add(hWnd); return true; }, IntPtr.Zero);

    return handles;
}


and sample usage:


private const uint WM_GETTEXT = 0x000D;

[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, int wParam, 
    StringBuilder lParam);

[STAThread]
static void Main(string[] args)
{
    foreach (var handle in EnumerateProcessWindowHandles(
        Process.GetProcessesByName("explorer").First().Id))
    {
        StringBuilder message = new StringBuilder(1000);
        SendMessage(handle, WM_GETTEXT, message.Capacity, message);
        Console.WriteLine(message);
    }
}

ich hoffe das hilft dir ebenfalls weiter.

Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.