Jak uzyskać tytuł bieżącego aktywnego okna przy użyciu języka C #?

109

Chciałbym wiedzieć, jak pobrać tytuł okna bieżącego aktywnego okna (tj. Tego, które ma fokus) przy użyciu C #.

d4nt
źródło
2
Czy próbowałeś określić, które okno w Twojej aplikacji ma fokus, czy też które okno dowolnej aplikacji ma fokus?
Peder Rice,
to jest istotne stackoverflow.com/questions/2423234/ ... więc jeśli chciałeś kliknąć przycisk, aby to zrobić, warto upewnić się, że twój formularz nie jest aktywny.
Barlop

Odpowiedzi:

165

Zobacz przykład, jak możesz to zrobić z pełnym kodem źródłowym tutaj:

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;
}

Edytowane z komentarzami @Doug McClean dla lepszej poprawności.

Jorge Ferreira
źródło
7
Nie zapomnij być dobrym obywatelem. Na blogs.msdn.com/oldnewthing/archive/2007/07/27/4072156.aspx i blogs.msdn.com/oldnewthing/archive/2008/10/06/8969399.aspx znajdują się odpowiednie informacje.
Greg D
3
notatka o newb, aby go uruchomić using System.Runtime.InteropServices; i gdzie umieścić import biblioteki DLL i statyczne linie zewnętrzne. wklejanie go w klasie
barlop
1
@smink Jak uzyskać aktywne okno pierwszego planu dla określonego użytkownika (powiedzmy, że proces działa jako usługa).
tchelidze
Witryna, z którą masz łącze, jest niedostępna. Oto (prawdopodobnie) jego archiwum internetowe: web.archive.org/web/20150814043810/http://www.csharphelp.com/…
Piotrek
2
Chcę również, aby moja aplikacja była powiadamiana za każdym razem, gdy zmieni się okno pierwszego planu. Czy jest na to jakieś wydarzenie?
Piotrek
18

Jeśli mówiłeś o WPF, użyj:

 Application.Current.Windows.OfType<Window>().SingleOrDefault(w => w.IsActive);
Skvettn
źródło
Jeśli cała aplikacja nie jest aktywna (inny program jest aktywny), żadne okno nie będzie miało ustawienia IsActive na true.
Todd
Właściwie może to być błąd, w moim przypadku próbowałem uzyskać dostęp do tablicy Window w wątku spoza interfejsu użytkownika. Jednak zobacz to również na wypadek, gdyby nadal mam rację: social.msdn.microsoft.com/Forums/vstudio/en-US/…
Todd
4

Zapętl się Application.Current.Windows[]i znajdź ten z IsActive == true.

shA.t
źródło
11
Czy nie działałoby to tylko w przypadku okien w bieżącej aplikacji .Net? Myślę, że d4nt chce uzyskać tytuł bieżącego aktywnego okna na pulpicie, bez względu na to, do jakiej aplikacji należy.
Quagmire
2

Oparty na funkcji GetForegroundWindow | Dokumenty Microsoft :

[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;
}

Obsługuje znaki UTF8.

Mohammad Dayyan
źródło
0

Jeśli zdarzy się, że potrzebujesz aktualnego aktywnego formularza z aplikacji MDI : (MDI- Multi Document Interface).

Form activForm;
activForm = Form.ActiveForm.ActiveMdiChild;
Arthur Zennig
źródło
-3

możesz użyć klasy procesu, to bardzo proste. użyj tej przestrzeni nazw

using System.Diagnostics;

jeśli chcesz utworzyć przycisk, aby uaktywnić okno.

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
źródło
2
To jest źle. Wyświetli tytuł twojego programu, a nie aktualnie aktywne okno.
Human