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

d4nt
fonte
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.

Jorge Ferreira
fonte
7
Não se esqueça de ser um bom cidadão. blogs.msdn.com/oldnewthing/archive/2007/07/27/4072156.aspx e blogs.msdn.com/oldnewthing/archive/2008/10/06/8969399.aspx têm informações relevantes.
Greg D,
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);
Skvettn
fonte
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.

shA.t
fonte
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
3

Use a API do Windows. Ligue GetForegroundWindow().

GetForegroundWindow()lhe dará um identificador (nomeado hWnd) para a janela ativa.

Documentação: função GetForegroundWindow | Microsoft Docs

ine
fonte
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.

Mohammad Dayyan
fonte
0

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

Form activForm;
activForm = Form.ActiveForm.ActiveMdiChild;
Arthur Zennig
fonte
-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.
    }
B.Beshoo
fonte
2
Isto está errado. Ele irá mostrar o título do seu programa não da janela ativa atual.
isHuman