C# 在WinForm下輸出訊息到Console

在WinForm下的專案可以使用 Console.WriteLine 輸出訊息到Console上

  • 開啟Console視窗AllocConsole
  • 確認Console視窗是否開啟GetConsoleWindow
[DllImport("kernel32.dll")]
static extern bool AllocConsole();

[DllImport("kernel32.dll")]
static extern IntPtr GetConsoleWindow();

private void button1_Click(object sender, EventArgs e)
{
    if(GetConsoleWindow() == IntPtr.Zero)
    {
        AllocConsole(); // 開啟 Console
        Console.WriteLine("Console 已啟動");
    }
    else
    {
        Console.WriteLine("Hello world");
    }            
}


讓Console視窗緊貼WinForm

[DllImport("kernel32.dll")]
static extern bool AllocConsole();

// Win32 API
[DllImport("kernel32.dll")]
static extern IntPtr GetConsoleWindow();


IntPtr consoleHandle;

[DllImport("user32.dll")]
static extern bool MoveWindow(
    IntPtr hWnd,
    int X,
    int Y,
    int nWidth,
    int nHeight,
    bool bRepaint);

[DllImport("user32.dll")]
static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

const int SW_HIDE = 0;
const int SW_SHOW = 5;

protected override void OnMove(EventArgs e)
{
    base.OnMove(e);
    SyncConsole();
}

protected override void OnResize(EventArgs e)
{
    base.OnResize(e);
    SyncConsole();
}

private void SyncConsole()
{
    if (consoleHandle == IntPtr.Zero) return;

    if (this.WindowState == FormWindowState.Minimized)
    {
        ShowWindow(consoleHandle, SW_HIDE);
        return;
    }

    ShowWindow(consoleHandle, SW_SHOW);

    int consoleWidth = 500;
    int consoleHeight = this.Height;

    int x = this.Right;
    int y = this.Top;

    MoveWindow(
        consoleHandle,
        x-14,
        y,
        consoleWidth,
        consoleHeight,
        true);
}

private void button1_Click(object sender, EventArgs e)
{      
    if (GetConsoleWindow() == IntPtr.Zero)
    {
        AllocConsole(); // 開啟 Console
        consoleHandle = GetConsoleWindow();
        SyncConsole();
        Console.WriteLine("Console 已啟動並貼齊 WinForm");
    }
    else
    {
        Console.WriteLine("Hello world");
    }
}

留言