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.

d4nt
quelle
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.

Jorge Ferreira
quelle
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);
Skvettn
quelle
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.

shA.t.
quelle
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
3

Verwenden Sie die Windows-API. Rufen Sie an GetForegroundWindow().

GetForegroundWindow()gibt Ihnen ein Handle (benannt hWnd) für das aktive Fenster.

Dokumentation: GetForegroundWindow-Funktion | Microsoft Docs

ine
quelle
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.

Mohammad Dayyan
quelle
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;
Arthur Zennig
quelle
-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.
    }
B.Beshoo
quelle
2
Das ist falsch. Es wird der Titel Ihres Programms angezeigt, nicht des aktuell aktiven Fensters.
isHuman