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.