提问人:Quidney 提问时间:11/15/2023 最后编辑:Quidney 更新时间:11/16/2023 访问量:98
C# 无法从代码中最大化控制台
C# Cannot maximize Console from within the code
问:
我尝试使用 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();
}
答:
1赞
wenbingeng-MSFT
11/15/2023
#1
您的代码在 Windows 10 中运行良好,但如果在 Win11 中选择 Windows 终端,您的代码将不起作用。
如果您使用的是 Win11:
请打开 Settings=>Privacy&security=>For developers=>Terminal=>Change to Windows Console Host
如果您在“隐私与安全性”中没有找到“面向开发者”,也可以直接在设置中搜索面向开发者。
此时,可以使用再次提供的代码最大化控制台程序。
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 嗨,我已经根据您的要求更新了答案。如果这对您有帮助,您可以标记它,以便它可以帮助更多人。
评论