2009-10-10 12 views
17

znalazłem jakiś kod źródłowy w tym wątku zamieszczonych przez Rex Logan tutaj na SO:pozycja Ustawienie oknie konsoli otwarty w WinForms App

link text

... tam też jakiś bardzo ciekawy kod pisał w tym samym wątku przez Foredecker, ale jest niekompletne i złożone: nie jestem na tyle na „Trace Facility umieć w pełni wdrożyć go ...

jestem w stanie użyć tego kodu Rex (Console uprzejmie) wysłany z powodzeniem w aplikacji WinForms, aby rejestrować różne zdarzenia i naciskać messa ges na które są przydatne w debugowaniu; Mogę też usunąć to z kodu aplikacji.

To, czego nie mogę zrobić, to niezawodnie ustawić pozycję ekranu w oknie konsoli po otwarciu okna konsoli (w przypadku obciążenia Main Form). Mam skompilować blokowanie błędy System.ArgumentOutOfRangeException jeśli próbuję ustawić WindowLeft lub WindowTop właściwości tak:

Stanowisko okno musi być ustawione tak, że obecny rozmiar okna pasuje wewnątrz bufora konsoli, a numery nie może być ujemny. Nazwa parametrów: lewy Rzeczywista wartość była #

mogę jednak ustawić WindowWidth i WindowHeight właściwości.

Próbowałem przeniesienie kodu, który uaktywnia konsoli różne lokalizacje w tym:

  1. w Program.cs złożyć przed MainForm jest „prowadzony
  2. przed i po wywołaniu” InitializeComponent() w MainForm konstruktor
  3. w przypadku Forma obciążenia
  4. w formie, zdarzenie

Conso Le został aktywowany w porządku we wszystkich tych miejscach kodu, ale bez zmiany w pozornie losowym przełączaniu się w miejscu, w którym znajdował się lewy górny kwadrant ekranu.

Otwarcie okna konsoli wydaje się różnić losowo (główny formularz jest zawsze inicjowany w tym samym miejscu na ekranie).

Odpowiedz

36

możesz spróbować czegoś takiego.

Ten kod ustawia położenie okna konsoli w aplikacji konsoli.

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

Ten kod ustawić położenie okna konsoli w WinForm aplikacji.

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

Dziękuję, RRUZ; Udało mi się wprowadzić twój kod do kodu podstawowego przesłanego przez Rex Logan i ustawić okno konsoli tam, gdzie chciałem. Jestem po prostu ciekawy: dlaczego wywołanie "Console.Read()?Jest to uruchomiona aplikacja WinForm, a ja używam Konsoli tylko do "rejestrowania": czy jest to standardowa rzecz do zrobienia podczas inicjowania konsoli z poziomu aplikacji WinForm? Wielkie dzięki! najlepiej, Bill – BillW

+0

@BillW - jest tam, dzięki czemu okno pozostaje widoczne, dopóki nie naciśniesz 'return'. Przykład nic nie robi po ustawieniu pozycji okna, więc po prostu się zamknie i nie zobaczysz, że ma właściwą pozycję. – ChrisF

+0

Witaj ChrisF, Dzięki za odpowiedź! fyi: Korzystanie z kodu opublikowanego przez Rex Logan, z którym łączyłem się w moim pierwotnym żądaniu, okno Console nie jest aktywne bez potrzeby wywoływania Console.Read(). best, Bill – BillW

Powiązane problemy