Wie erhalte ich mit c # den Titel des aktuell aktiven Fensters?


109

Ich möchte wissen, wie man mit C # den Fenstertitel des aktuell aktiven Fensters (dh des Fensters mit Fokus) abruft.


2
Haben Sie versucht festzustellen, welches Fenster in Ihrer Anwendung den Fokus hat oder welches Fenster einer Anwendung den Fokus hat?
— Peder Rice

Dies ist relevant für stackoverflow.com/questions/2423234/…. Wenn Sie also eine Schaltfläche anklicken möchten, um dies zu tun, sollten Sie sicherstellen, dass Ihr Formular nicht den Fokus hat.
— Barlop

Antworten:


165

Ein Beispiel dafür, wie Sie dies mit vollständigem Quellcode tun können, finden Sie hier:

http://www.csharphelp.com/2006/08/get-current-window-handle-and-caption-with-windows-api-in-c/

[DllImport("user32.dll")]
static extern IntPtr GetForegroundWindow();

[DllImport("user32.dll")]
static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int count);

private string GetActiveWindowTitle()
{
    const int nChars = 256;
    StringBuilder Buff = new StringBuilder(nChars);
    IntPtr handle = GetForegroundWindow();

    if (GetWindowText(handle, Buff, nChars) > 0)
    {
        return Buff.ToString();
    }
    return null;
}

Bearbeitet mit @ Doug McClean Kommentaren für eine bessere Korrektheit.


7
Vergiss nicht, ein guter Bürger zu sein. blogs.msdn.com/oldnewthing/archive/2007/07/27/4072156.aspx und blogs.msdn.com/oldnewthing/archive/2008/10/06/8969399.aspx haben relevante Informationen.
— Greg D

3
eine neue Notiz, um sie zum Laufen zu bringen using System.Runtime.InteropServices; und wo die DLL-Import- und statischen externen Zeilen abgelegt werden sollen. Einfügen in die Klasse
— Barlop

1
@smink So erhalten Sie ein aktives Vordergrundfenster für einen bestimmten Benutzer (sagen wir, der Prozess wird als Dienst ausgeführt).
— Tchelidze

Die Site, auf die Sie verlinkt haben, ist nicht verfügbar. Hier ist (möglicherweise) Webarchiv davon: web.archive.org/web/20150814043810/http://www.csharphelp.com/…
— Piotrek

2
Außerdem möchte ich, dass meine App jedes Mal benachrichtigt wird, wenn sich das Vordergrundfenster ändert. Gibt es dafür ein Ereignis?
— Piotrek

18

Wenn Sie über WPF gesprochen haben, verwenden Sie:

 Application.Current.Windows.OfType<Window>().SingleOrDefault(w => w.IsActive);

Wenn die gesamte Anwendung nicht aktiv ist (ein anderes Programm hat den Fokus), wird in keinem Fenster IsActive auf true gesetzt.
— Todd

Eigentlich könnte das falsch sein, in meinem Fall habe ich versucht, auf das Window-Array in einem Nicht-UI-Thread zuzugreifen. Sehen Sie dies jedoch auch, falls ich noch Recht habe: social.msdn.microsoft.com/Forums/vstudio/en-US/…
— Todd

4

Schleife vorbei Application.Current.Windows[]und finde den mit IsActive == true.


11
Würde dies nicht nur für die Fenster in der aktuellen .Net-Anwendung funktionieren? Ich denke, d4nt möchte den Titel des aktuell aktiven Fensters auf dem Desktop erhalten, egal zu welcher Anwendung es gehört.
— Sumpf


2

Basierend auf der GetForegroundWindow-Funktion | Microsoft Docs :

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern IntPtr GetForegroundWindow();

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int count);

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern int GetWindowTextLength(IntPtr hWnd);

private string GetCaptionOfActiveWindow()
{
    var strTitle = string.Empty;
    var handle = GetForegroundWindow();
    // Obtain the length of the text   
    var intLength = GetWindowTextLength(handle) + 1;
    var stringBuilder = new StringBuilder(intLength);
    if (GetWindowText(handle, stringBuilder, intLength) > 0)
    {
        strTitle = stringBuilder.ToString();
    }
    return strTitle;
}

Es unterstützt UTF8-Zeichen.


0

Wenn es passiert, dass Sie die brauchen aktuelle aktive Formular aus Ihrer MDI-Anwendung: (MDI-Multi Document Interface).

Form activForm;
activForm = Form.ActiveForm.ActiveMdiChild;

-3

Sie können Prozessklasse verwenden, es ist sehr einfach. Verwenden Sie diesen Namespace

using System.Diagnostics;

Wenn Sie eine Schaltfläche erstellen möchten, um ein aktives Fenster zu erhalten.

private void button1_Click(object sender, EventArgs e)
    {            
       Process currentp = Process.GetCurrentProcess();
       TextBox1.Text = currentp.MainWindowTitle;  //this textbox will be filled with active window.
    }

2
Das ist falsch. Es wird der Titel Ihres Programms angezeigt, nicht des aktuell aktiven Fensters.
— isHuman
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.