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 #.


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.


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

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.


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.


0

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

Form activForm;
activForm = Form.ActiveForm.ActiveMdiChild;

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

2
To jest źle. Wyświetli tytuł twojego programu, a nie aktualnie aktywne okno.
Human
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.