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

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

Jorge Ferreira
fuente
7
No olvide ser un buen ciudadano. blogs.msdn.com/oldnewthing/archive/2007/07/27/4072156.aspx y blogs.msdn.com/oldnewthing/archive/2008/10/06/8969399.aspx tienen información relevante.
Greg D
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);
Skvettn
fuente
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.

shA.t
fuente
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.

Mohammad Dayyan
fuente
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;
Arthur Zennig
fuente
-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.
    }
B.Beshoo
fuente
2
Esto está mal. Mostrará el título de su programa, no de la ventana activa actual.
isHuman