¿Cómo obtengo el título de la ventana activa actual usando c #?


109

Me gustaría saber cómo tomar el título de la ventana de la ventana activa actual (es decir, la que tiene el foco) usando C #.


2
¿Estaba tratando de determinar qué ventana dentro de su aplicación tiene el foco o qué ventana de cualquier aplicación tiene el foco?
— Peder Rice

esto es relevante stackoverflow.com/questions/2423234/… por lo que si desea hacer clic en un botón para hacerlo, vale la pena asegurarse de que su formulario no se enfoque.
— Barlop

Respuestas:


165

Vea un ejemplo de cómo puede hacer esto con el código fuente completo aquí:

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 con los comentarios de @Doug McClean para una mejor corrección.



3
una nota newb, para que se ejecute, using System.Runtime.InteropServices; y vuelva a colocar las líneas dll import y static extern. pegarlo dentro de la clase
— barlop

1
@smink Cómo obtener una ventana de primer plano activa para un usuario específico (digamos que el proceso se ejecuta como servicio).
— tchelidze

El sitio al que ha vinculado no está disponible. Aquí está (posiblemente) un archivo web del mismo: web.archive.org/web/20150814043810/http://www.csharphelp.com/…
— Piotrek

2
Además, quiero que se notifique a mi aplicación cada vez que cambie la ventana de primer plano. ¿Hay algún evento para eso?
— Piotrek

18

Si estaba hablando de WPF, use:

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

Si toda la aplicación no está activa (otro programa tiene el foco), ninguna ventana tendrá IsActive establecido en verdadero.
— Todd

En realidad, eso podría estar mal, en mi caso, estaba tratando de acceder a la matriz de Windows en un hilo que no es de UI. Sin embargo, vea esto también en caso de que todavía tenga
— Todd

4

Da un vuelco Application.Current.Windows[]y encuentra el que tiene IsActive == true.


11
¿No funcionaría esto solo para las ventanas de la aplicación .Net actual? Creo que d4nt quiere obtener el título de la ventana activa actual en el escritorio, sin importar a qué aplicación pertenece.
— Quagmire


2

Basado en la función GetForegroundWindow | Documentos de Microsoft :

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

Admite caracteres UTF8.


0

Si sucede que necesita el formulario activo actual de su aplicación MDI : (MDI- Interfaz de documentos múltiples).

Form activForm;
activForm = Form.ActiveForm.ActiveMdiChild;

-3

puedes usar la clase de proceso, es muy fácil. usa este espacio de nombres

using System.Diagnostics;

si desea hacer un botón para activar la ventana.

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
Esto está mal. Mostrará el título de su programa, no de la ventana activa actual.
— isHuman
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.