C# 无法从代码中最大化控制台

C# Cannot maximize Console from within the code

提问人:Quidney 提问时间:11/15/2023 最后编辑:Quidney 更新时间:11/16/2023 访问量:98

问:

我尝试使用 C# 命令最大化控制台 .NET 应用程序,但它不起作用。

编辑:我觉得有必要指定我使用“控制台应用程序(.NET Framework)”而不是“(控制台应用程序(NET Core))” .NET 版本为:4.7.2 Windows 版本是:Windows 11(使用新终端作为我的 CMD)

这是我尝试过的: 示例1:

using System;
using System.Runtime.InteropServices;

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

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
private const int MAXIMIZE = 3;
private const int MINIMIZE = 6;

static void Main(string[] args)
{
    ShowWindow(GetConsoleWindow(), MAXIMIZE);
    Console.ReadKey();
}

在第一个示例中,如果您键入“MINIMIZE”而不是“MAXIMIZE”,则 Minimize 会最小化,但不会 MAXIMIZE...

示例2:

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

private static void Maximize()
{
    Process p = Process.GetCurrentProcess();
    ShowWindow(p.MainWindowHandle, 3); //SW_MAXIMIZE = 3
}

static void Main(string[] args)
{
   Maximize();
   Console.ReadKey();
}
C# .NET Visual-Studio 控制台

评论

0赞 Mikael 11/15/2023
这回答了你的问题吗?最大化控制台窗口 - C#
0赞 nbk 11/15/2023
Micorsoft 建议 stackoverflow.com/a/72326974/5193536
0赞 Quidney 11/15/2023
@Mikael我尝试了所有 3 个,实际上我列出的 2 个示例实际上来自该页面。但那是从 2014 年开始的,所以我认为从那时起情况可能会发生变化。几个月前,我尝试对 Forms 应用程序做同样的事情,但它不起作用。现在,我需要它来作为控制台应用程序。
0赞 Quidney 11/15/2023
@nbk 至于第二条评论,由于某种原因,它也不起作用。我什至尝试从构建中启动程序以防万一,(而不是调试)
0赞 Vyacheslav Benedichuk 11/15/2023
您使用的是哪个 .net 版本和哪个 Windows 版本?我刚刚在 .net core 6 中尝试了您的第一个示例,它完美地最大化了。

答:

1赞 wenbingeng-MSFT 11/15/2023 #1

您的代码在 Windows 10 中运行良好,但如果在 Win11 中选择 Windows 终端,您的代码将不起作用。

如果您使用的是 Win11:

请打开 Settings=>Privacy&security=>For developers=>Terminal=>Change to Windows Console Host

如果您在“隐私与安全性”中没有找到“面向开发者”,也可以直接在设置中搜索面向开发者。

enter image description here

enter image description here

此时,可以使用再次提供的代码最大化控制台程序。

using System;
using System.Runtime.InteropServices;

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

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
private const int MAXIMIZE = 3;
private const int MINIMIZE = 6;

static void Main(string[] args)
{
    ShowWindow(GetConsoleWindow(), MAXIMIZE);
    Console.ReadKey();
}

更新:

如果不想手动将 Windows 终端调整为 Windows 控制台主机,可以直接使用以下代码:

internal class Program
{
    [DllImport("user32.dll")]
    static extern IntPtr GetForegroundWindow();
    [DllImport("user32.dll")]
    static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
    [DllImport("user32.dll")]
    static extern bool GetWindowRect(IntPtr hWnd, out Rect lpRect);
    [DllImport("user32.dll")]
    static extern bool MoveWindow(IntPtr hWnd, int x, int y, int nWidth, int nHeight, bool bRepaint);

    private const int SW_RESTORE = 9; // Use SW_RESTORE to restore the window if it's minimized

    private static void Main(string[] args)
    {
        // Import the necessary functions from user32.dll

        // Constants for the ShowWindow function
        const int SW_MAXIMIZE = 3;
        // Get the handle of the console window
        IntPtr consoleWindowHandle = GetForegroundWindow();

        // Restore the window if it's minimized
        ShowWindow(consoleWindowHandle, SW_RESTORE);

        // Maximize the console window
        ShowWindow(consoleWindowHandle, SW_MAXIMIZE);

        // Get the screen size
        Rect screenRect;
        GetWindowRect(consoleWindowHandle, out screenRect);

        // Resize and reposition the console window to fill the screen
        var width = screenRect.Right - screenRect.Left;
        var height = screenRect.Bottom - screenRect.Top;
        MoveWindow(consoleWindowHandle, (int)screenRect.Left, (int)screenRect.Top, (int)width, (int)height, true);

        Console.ReadKey();
    }
}

// Define the Rect structure
public struct Rect
{
    public int Left;
    public int Top;
    public int Right;
    public int Bottom;
}

评论

0赞 Quidney 11/16/2023
我理解这个解决方案,我很感激它,但是由于我正在制作一个程序,我不能只期望每个人都在执行应用程序之前这样做。我知道这是Microsoft的懒惰,但没有解决方法吗?(不仅仅是本地的哈哈)
1赞 wenbingeng-MSFT 11/16/2023
@Quidney 嗨,我已经根据您的要求更新了答案。如果这对您有帮助,您可以标记它,以便它可以帮助更多人。