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.