Como obtenho o título da janela ativa atual usando c #?


109

Eu gostaria de saber como pegar o título da janela da janela ativa atual (ou seja, aquela que está em foco) usando C #.


2
Você estava tentando determinar qual janela em seu aplicativo tem foco ou qual janela de qualquer aplicativo tem foco?
— Peder Rice de

isso é relevante stackoverflow.com/questions/2423234/… então se você quiser um clique de botão para fazer isso, vale a pena ter certeza de que seu formulário não terá o foco.
— barlop de

Respostas:


165

Veja um exemplo de como você pode fazer isso com o código-fonte completo aqui:

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

Editado com comentários de @Doug McClean para melhor correção.



3
uma nota newb, para fazê-lo funcionar, using System.Runtime.InteropServices; e re onde colocar a importação dll e as linhas externas estáticas. colando dentro da classe
— barlop

1
@smink Como obter a janela de primeiro plano ativa para um usuário específico (digamos que o processo é executado como serviço).
— tchelidze

O site ao qual você se vinculou não está disponível. Aqui está (possivelmente) o arquivo da web: web.archive.org/web/20150814043810/http://www.csharphelp.com/…
— Piotrek

2
Além disso, quero que meu aplicativo seja notificado sempre que a janela de primeiro plano for alterada. Existe algum evento para isso?
— Piotrek

18

Se você estava falando sobre WPF, use:

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

Se o aplicativo inteiro não estiver ativo (outro programa está em foco), nenhuma janela terá IsActive definido como verdadeiro.
— Todd

Na verdade, isso pode estar errado, no meu caso, eu estava tentando acessar o array Window em um thread não-UI. No entanto, veja também caso eu ainda esteja certo: social.msdn.microsoft.com/Forums/vstudio/en-US/…
— Todd

4

Faça um loop Application.Current.Windows[]e encontre aquele com IsActive == true.


11
Isso não funcionaria apenas para as janelas no aplicativo .Net atual? Acho que d4nt deseja obter o título da janela ativa atual na área de trabalho, não importa a qual aplicativo ela pertence.
— Quagmire de


2

Baseado na função 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;
}

Suporta caracteres UTF8.


0

Se acontecer de você precisar do Current Active Form do seu aplicativo MDI : (MDI- Multi Document Interface).

Form activForm;
activForm = Form.ActiveForm.ActiveMdiChild;

-3

você pode usar a classe de processo, é muito fácil. use este namespace

using System.Diagnostics;

se você quiser fazer um botão para obter a janela ativa.

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
Isto está errado. Ele irá mostrar o título do seu programa não da janela ativa atual.
— isHuman
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.