Come ottengo il titolo della finestra attiva corrente utilizzando c #?


109

Mi piacerebbe sapere come afferrare il titolo della finestra della finestra attiva corrente (cioè quella che ha il focus) usando C #.


2
Stavi cercando di determinare quale finestra all'interno dell'applicazione è attiva o quale finestra di un'applicazione è attiva?
Peder Rice

questo è rilevante stackoverflow.com/questions/2423234/… quindi se vuoi che un pulsante faccia clic per farlo, vale la pena assicurarti che il tuo modulo non sia messo a fuoco.
barlop

Risposte:


165

Guarda un esempio su come puoi farlo con il codice sorgente completo qui:

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

Modificato con i commenti di @Doug McClean per una migliore correttezza.


7
Non dimenticare di essere un buon cittadino. blogs.msdn.com/oldnewthing/archive/2007/07/27/4072156.aspx e blogs.msdn.com/oldnewthing/archive/2008/10/06/8969399.aspx hanno informazioni pertinenti.
Greg D,

3
una nota newb, per farlo funzionare, using System.Runtime.InteropServices; e dove mettere l'importazione della dll e le righe esterne statiche. incollandolo all'interno della classe
barlop

1
@smink Come ottenere la finestra in primo piano attiva per un utente specifico (diciamo che il processo viene eseguito come servizio).
tchelidze

Il sito a cui sei collegato non è disponibile. Ecco (forse) l'archivio web di esso: web.archive.org/web/20150814043810/http://www.csharphelp.com/…
Piotrek

2
Inoltre, desidero che la mia app riceva una notifica ogni volta che la finestra in primo piano cambia. C'è qualche evento per questo?
Piotrek

18

Se stavi parlando di WPF, usa:

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

Se l'intera applicazione non è attiva (un altro programma è attivo), nessuna finestra avrà IsActive impostato su true.
Todd,

In realtà potrebbe essere sbagliato, nel mio caso stavo cercando di accedere all'array Window su un thread non dell'interfaccia utente. Tuttavia, vedi anche questo nel caso in cui ho ancora ragione: social.msdn.microsoft.com/Forums/vstudio/en-US/…
Todd

4

Fai un giro Application.Current.Windows[]e trova quello con IsActive == true.


11
Non funzionerebbe solo per le finestre nell'attuale applicazione .Net? Penso che d4nt voglia ottenere il titolo della finestra attiva corrente sul desktop, indipendentemente dall'applicazione a cui appartiene.
Quagmire


2

Basato sulla funzione GetForegroundWindow | 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;
}

Supporta i caratteri UTF8.


0

Se succede che hai bisogno del modulo attivo corrente dalla tua applicazione MDI : (MDI- Multi Document Interface).

Form activForm;
activForm = Form.ActiveForm.ActiveMdiChild;

-3

puoi usare la classe di processo è molto semplice. usa questo spazio dei nomi

using System.Diagnostics;

se vuoi creare un pulsante per attivare la finestra.

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
Questo è sbagliato. Mostrerà il titolo del tuo programma non della finestra attiva corrente.
isHuman
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.