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.