2008-10-17 32 views
8

¿Cómo puedo llevar una ventana de aplicación de consola al frente en C# (especialmente cuando se ejecuta el depurador de Visual Studio)?traer una ventana de consola al frente en C#

+0

¿En qué contexto y por qué quieres hacer esto? Si bien hay casos legítimos, generalmente este tipo de cosas es más problemático de lo que vale. – ICR

Respuesta

16

Es hacky, es horrible, pero funciona para mí (gracias, pinvoke.net!):

using System; 
using System.Diagnostics; 
using System.Runtime.InteropServices; 
using System.Threading; 

public class Test 
{ 

    [DllImport("user32.dll")] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    static extern bool SetForegroundWindow(IntPtr hWnd); 

    [DllImport("user32.dll", EntryPoint="FindWindow", SetLastError = true)] 
    static extern IntPtr FindWindowByCaption(IntPtr zeroOnly, string lpWindowName); 

    public static void Main() 
    { 
     string originalTitle = Console.Title; 
     string uniqueTitle = Guid.NewGuid().ToString(); 
     Console.Title = uniqueTitle; 
     Thread.Sleep(50); 
     IntPtr handle = FindWindowByCaption(IntPtr.Zero, uniqueTitle); 

     if (handle == IntPtr.Zero) 
     { 
      Console.WriteLine("Oops, cant find main window."); 
      return; 
     } 
     Console.Title = originalTitle; 

     while (true) 
     { 
      Thread.Sleep(3000); 
      Console.WriteLine(SetForegroundWindow(handle)); 
     } 
    } 
} 
+0

Por favor, nunca agregue esto a su código solo para que aparezca en la parte superior cuando se depura. – tvanfosson

+1

@tv - Tal vez podría dar una explicación a su declaración absoluta. Personalmente, creo que este es un uso legítimo y recomendado de las funciones de administración de ventanas. No es el mejor enfoque DRY pero con un poco de refactorización es una práctica común en el desarrollo de aplicaciones win32. No es Hackey, es cómo mueves las ventanas alrededor del escritorio. –

+0

solo para agregar, si busca ejecutar este código solo cuando esté en el depurador de Visual Studio, puede usar lo siguiente: if (Debugger.IsAttached == true) {...} –

1

conseguir dos monitores (por lo menos) y VisualStudio abierta en el monitor secundario. Cuando ejecuta su aplicación desde VisualStudio, se iniciará de manera predeterminada en el monitor principal. Como es la última aplicación que se abre, comienza en la parte superior y cambiar a VisualStudio no la afecta. Funciona para mí de todos modos.

Si aún no tiene un segundo monitor, en mi humilde opinión, debería hacerlo.

6

Esto es lo que haría.

[DllImport("kernel32.dll", ExactSpelling = true)] 
public static extern IntPtr GetConsoleWindow(); 

[DllImport("user32.dll")] 
[return: MarshalAs(UnmanagedType.Bool)] 
public static extern bool SetForegroundWindow(IntPtr hWnd); 

public void BringConsoleToFront() 
{ 
    SetForegroundWindow(GetConsoleWindow()); 
} 
0

Toda una respuesta tardía, pero he usado el siguiente trabajo en torno a:

Si está ejecutando una aplicación de consola con Windows Forms, y quiere llevar la consola a la parte delantera de la forma, hay no es una manera sensata de hacer esto, como hemos visto anteriormente. Sin embargo, hay una forma de hacerlo con Windows Forms: puede usar BringToFront() y SendToBack() para cambiar las capas de la ventana en su programa. Mi programa tenía una forma y una consola, la consola tenía que estar al frente, así que envié el formulario a la parte posterior.

Desventaja: si su usuario es multitarea, y desea que la consola esté al frente de todo, esto no funcionará. Sin embargo, si solo desea afectar las ventanas de su programa, esta es una solución adecuada.

Cuestiones relacionadas