2008-09-22 23 views
88

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

+1

estaba tratando de determinar qué ventana dentro de la aplicación tiene el foco o qué ventana de cualquier aplicación que tenga el foco? –

+0

esto es relevante https://stackoverflow.com/questions/2423234/make-a-form-not-focusable-in-c-sharp/2428108#2428108 lo que si quería hacer clic en un botón para hacerlo entonces vale la pena asegurarse tu forma no toma enfoque – barlop

Respuesta

133

Véase el ejemplo de cómo se 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 @Doug McClean comentarios para mejor corrección.

+7

No se olvide de ser un buen ciudadano. http://blogs.msdn.com/oldnewthing/archive/2007/07/27/4072156.aspx y http://blogs.msdn.com/oldnewthing/archive/2008/10/06/8969399.aspx tienen información relevante . –

+3

una nueva nota, para que se ejecute, 'usando System.Runtime.InteropServices;' y donde colocar la dll import y static extern lines. pegándolo dentro de la clase – barlop

+1

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

5

bucle sobre Application.Current.Windows [] y encontrar el uno con IsActive = true.

+10

¿No funcionaría esto solo para las ventanas en 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 pertenezca. – Quagmire

15

Si hablabas de WPF a continuación, utilizar:

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

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

+0

En realidad, podría ser incorrecto, en mi caso, estaba tratando de acceder a la matriz de Windows en un hilo no relacionado con la interfaz de usuario. Sin embargo, también vea esto en caso de que aún tenga razón: https://social.msdn.microsoft.com/Forums/vstudio/en-US/654c74fe-0a88-425f-99cd-ccf97ff234bc/active-window-of-an- inactive-application? forum = wpf – Todd

-3

puede utilizar la clase proceso es muy fácil. utilizar este espacio de nombres

using System.Diagnostics; 

si usted quiere hacer un botón para obtener ventana activa.

private void button1_Click(object sender, EventArgs e) 
    {    
     Process currentp = Process.GetCurrentProcess(); 
     TextBox1.Text = currentp.MainWindowTitle; //this textbox will be filled with active window. 
    } 
+1

Esto es incorrecto. Mostrará el título de su programa no de la ventana activa actual. – isHuman

0

Si sucede que lo que necesita la forma activa actual de su aplicación MDI: (MDI-Multi Documento Interface).

Form activForm; 
activForm = Form.ActiveForm.ActiveMdiChild; 
0

Base en https://msdn.microsoft.com/en-us/library/ms633505(VS.85).aspx

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

Es compatible con caracteres UTF8.

Cuestiones relacionadas