2009-10-10 11 views
17

me encontré con algo de código fuente en este hilo publicado por Rex Logan aquí en SO:Posición de ajuste de una ventana de consola abre en una aplicación Windows Forms

link text

... también hay algo de código muy interesante publicado en este mismo hilo por Foredecker, pero es incompleto y complejo: no estoy lo suficientemente arriba en la instalación 'Trace para saber cómo implementarlo completamente ...

Puedo usar este código de consola Rex (amablemente) publicado con éxito en una aplicación de WinForms para registrar varios eventos, y para empujar messa ges en los que son útiles para la depuración; Puedo borrarlo del código de la aplicación, también.

Lo que aparentemente no puedo hacer es establecer de forma confiable la posición de la pantalla de la ventana de la consola cuando abro la ventana de la consola (en el evento Carga de formulario principal). Consigo compilar el bloqueo de errores System.ArgumentOutOfRangeException si intento para establecer windowLeft o WindowTop propiedades como esta:

La posición de la ventana se debe establecer tales que el tamaño de la ventana actual se ajusta en el búfer de la consola, y los números de no debe ser negativo Nombre Parámetro: a la izquierda del valor real era #

soy capaz, sin embargo, para establecer WindowWidth y WindowHeight propiedades.

he intentado mover el código que activa los distintos lugares de la consola incluyendo:

  1. en el archivo antes de la Program.cs MainForm es 'ejecutar
  2. antes y después de la llamada a' InitializeComponent() en la MainForm ctor
  3. en el evento Form Load
  4. en la forma mostrada caso

la Conso El código se activó correctamente en todos estos lugares, pero sin cambios en la conmutación aparentemente aleatoria de donde apareció el cuadrante superior izquierdo de la pantalla.

El lugar donde se abre la ventana de la consola parece variar al azar (el formulario principal siempre se inicializa en el mismo lugar en la pantalla).

Respuesta

36

puede intentar algo como esto.

Este código establece la posición de la ventana de la consola en una aplicación de consola .

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Runtime.InteropServices; 


namespace ConsoleApplication10 
{ 
    class Program 
    { 
    const int SWP_NOSIZE = 0x0001; 


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

    private static IntPtr MyConsole = GetConsoleWindow(); 

    [DllImport("user32.dll", EntryPoint = "SetWindowPos")] 
    public static extern IntPtr SetWindowPos(IntPtr hWnd, int hWndInsertAfter, int x, int Y, int cx, int cy, int wFlags); 

    static void Main(string[] args) 
    { 
     int xpos = 300; 
     int ypos = 300; 
     SetWindowPos(MyConsole, 0, xpos, ypos, 0, 0, SWP_NOSIZE); 
     Console.WriteLine("any text"); 
     Console.Read(); 
    } 
    } 
} 

Este código establece la posición de la ventana de consola en una aplicación WinForm.

using System; 
using System.Collections.Generic; 
using System.Windows.Forms; 
using System.Runtime.InteropServices; 


namespace WindowsFormsApplication10 
{ 
    static class Program 
    { 

    const int SWP_NOSIZE = 0x0001; 

    [System.Runtime.InteropServices.DllImport("kernel32.dll")] 
    private static extern bool AllocConsole(); 

    [DllImport("user32.dll", EntryPoint = "SetWindowPos")] 
    public static extern IntPtr SetWindowPos(IntPtr hWnd, int hWndInsertAfter, int x, int Y, int cx, int cy, int wFlags); 

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

    [STAThread] 
    static void Main() 
    { 
     AllocConsole(); 
     IntPtr MyConsole = GetConsoleWindow(); 
     int xpos = 1024; 
     int ypos = 0; 
     SetWindowPos(MyConsole, 0, xpos, ypos, 0, 0, SWP_NOSIZE); 
     Console.WindowLeft=0; 
     Console.WriteLine("text in my console"); 

     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Application.Run(new Form1()); 
    } 
    } 
} 
+0

Gracias, RRUZ; Pude incorporar tu código en el código base publicado por Rex Logan y configurar la ventana de la Consola donde yo quería. Solo tengo curiosidad: ¿por qué la llamada a 'Console.Read()?Esta es una aplicación de WinForms que estoy ejecutando, y estoy usando la consola solo para "iniciar sesión": ¿esto es una tarea estándar al inicializar una consola desde una aplicación WinForm? ¡Muchas gracias! mejor, Bill – BillW

+0

@BillW - está ahí para que la ventana permanezca visible hasta que toques 'return'. El ejemplo no hace nada después de establecer la posición de la ventana, por lo que simplemente se cerraría y no vería que tenía la posición correcta. – ChrisF

+0

Hola, ChrisF, ¡Gracias por tu respuesta! fyi: Usando el código publicado por Rex Logan al que me he vinculado en mi solicitud original, la ventana de la Consola persiste sin necesidad de llamar a Console.Read(). mejor, Bill – BillW

Cuestiones relacionadas