2009-10-10 3 views
17

ho trovato un po 'di codice sorgente in questa discussione inviato da Rex Logan qui su SO:posizione Impostazione di una finestra di console aperta in un WinForms App

link text

... c'è anche un po' di codice molto interessante pubblicato in questo stesso thread di Foredecker, ma è incompleto e complesso: non sono abbastanza su 'Trace facility per sapere come implementarlo completamente ...

Sono in grado di utilizzare questo codice di console Rex (gentilmente) inviato correttamente in un'applicazione WinForms per registrare vari eventi e per spingere messa ges su cui sono utili nel debugging; Posso cancellarlo anche dal codice dell'applicazione.

Quello che non riesco a fare è impostare in modo affidabile la posizione dello schermo della finestra della console quando apro la finestra della console (nell'evento di caricamento del modulo principale). Ottengo compilazione errori di blocco System.ArgumentOutOfRangeException se provo a impostare WindowLeft o visualizza locandina proprietà come questa:

La posizione della finestra deve essere impostato in modo che la dimensione della finestra corrente si inserisce all'interno del buffer della console, ed i numeri non deve essere negativo Nome parametro: sinistro Valore reale era #

sono in grado, tuttavia, di impostare WindowWidth e WindowHeight proprietà.

ho cercato di spostare il codice che attiva le varie località della console tra cui:

  1. nel file Program.cs prima che il MainForm é '
  2. prima e dopo la chiamata a' InitializeComponent() in la MainForm ctor
  3. nell'evento Form Load
  4. nella forma mostrata evento

la Conso Le è stato attivato bene in tutti questi punti del codice, ma senza alcun cambiamento nel passaggio apparentemente casuale di dove si trovava nel quadrante in alto a sinistra dello schermo.

Dove si apre la finestra della console sembra variare a caso (il modulo principale viene sempre inizializzato nello stesso punto sullo schermo).

risposta

36

puoi provare qualcosa di simile.

Questo codice imposta la posizione della finestra della console in un'applicazione console .

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(); 
    } 
    } 
} 

Questo codice impostare la posizione della finestra della console in un WinForm Application.

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

Grazie, RRUZ; Sono stato in grado di incorporare il codice nel codice di base pubblicato da Rex Logan e impostare la finestra della console dove volevo. Sono solo curioso: perché la chiamata a 'Console.Read()?Questa è un'app WinForms in esecuzione e sto utilizzando la console solo per "logging": è una cosa standard da fare quando si inizializza una console da un'app WinForm? Mille grazie! meglio, Bill – BillW

+0

@BillW: è lì in modo che la finestra rimanga visibile fino a quando non si preme 'return'. L'esempio non fa nulla dopo aver impostato la posizione della finestra, quindi si chiudeva semplicemente e non si vedeva che aveva la giusta posizione. – ChrisF

+0

Ciao ChrisF, Grazie per la vostra risposta! fyi: Usando il codice inviato da Rex Logan a cui mi sono collegato nella mia richiesta originale, la finestra della console rimane attiva senza bisogno di una chiamata a Console.Read(). best, Bill – BillW