Как получить размер формы консоли Windows? - PullRequest
3 голосов
/ 10 ноября 2019

Я ищу способ получить размер фактического окна консоли в пикселях. Все, что я нашел здесь, - это winforms или WPF, которые я не использую. Я не ищу, как получить размер внутри окна консоли, но насколько велико само окно .

Ответы [ 2 ]

3 голосов
/ 10 ноября 2019

Я ищу в Интернете, но ничего полезного не нашел.

Все ответы возвращают либо количество символов, либо полное разрешение экрана.

Консоль Windows исторически является эмуляцией оболочки DOS.

От Как получить размер экрана Консольного приложения? :

using System.Management;  // Need assembly reference added to project

Console.Write("Console resolution in char:");
Console.Write(Console.WindowWidth + "x" + Console.WindowHeight);

var scope = new ManagementScope();
scope.Connect();
var query = new ObjectQuery("SELECT * FROM Win32_VideoController");
using ( var searcher = new ManagementObjectSearcher(scope, query) )
  foreach ( var result in searcher.Get() )
    Console.WriteLine("Screen resolution in pixels: {0}x{1}",
                      result.GetPropertyValue("CurrentHorizontalResolution"),
                      result.GetPropertyValue("CurrentVerticalResolution"));

Возвращает разрешение экрана из текущего режима видеодрайвера.

Командная строка Windows - больше не командная строка DOS, а уменьшенная оболочка.

Многие вещи и многие команды DOS были потеряны.

Вы не можете больше создавать программы в самой консоли.

API вывода командной строки теперь очень прост и прост.

Сегодня консольное приложение может знать свое разрешение только в символах.

Нет более продвинутого API и нет доступных прерываний.

Оболочка Windows DOS COMMAND.COM была заброшена для командной строки CMD.EXE после Windows Me.

Нет простого способа узнать, какое разрешение в pixels из Windows, которая «размещает» внутреннюю консоль.

using System.Diagnostics;
using System.Drawing;
using System.Runtime.InteropServices;

[DllImport("user32.dll")]
private static extern int GetWindowRect(IntPtr hwnd, out Rectangle rect);

Rectangle rect;
GetWindowRect(Process.GetCurrentProcess().MainWindowHandle, out rect);
Console.WriteLine($"Console window location: {rect.X}x{rect.Y}");
Console.WriteLine($"Console window resolution: {rect.Width}x{rect.Height}");

Но результат не очень точный.

Например, он показывает:

Console window location: 187x174
Console window resolution: 1336x812

Когдареальное разрешение - 1149x638 ...

И это разрешение окна консоли меняется при каждом запуске ...

Console window location: 99x58
Console window resolution: 1248x696

Console window location: 143x116
Console window resolution: 1292x754

Console window location: 77x29
Console window resolution: 1226x667

Console window location: 187x174
Console window resolution: 1336x812

Реальный размер формы консоли:

RealWidth = rect.Width - rect.X;
RealHeight = rect.Height - rect.Y;
0 голосов
/ 10 ноября 2019

Проблема и ее история

Я сомневаюсь, что Консоль каким-либо образом находится под уровнем контроля, который вам необходим для этого. По сути, когда консоль изначально проектировалась, идея окна еще не была придумана. Предполагается, что они являются полноэкранными в очень низком разрешении, что было распространено в те времена. И с тех пор они действительно никогда не менялись.

На более высоких разрешениях лучшее возможное уравнение - создать окно, которое покрывает часть экрана. Но это окно только под управлением ОС, а не ваше.

У вас может быть консольное окно, параллельное обычному графическому интерфейсу рабочего стола. Это на самом деле довольно просто . Но это все та же старая консоль со всеми ограничениями, которые вы получили прямо сейчас.

Мой лучший совет:

Прекратите пытаться использовать консоль. Вместо этого fake в Консольном окне с использованием WindowsForms, WPF или UWP.

Использование Process и Input / Перенаправление потока вывода , вы можете легко управлять командной строкой из WinForms/ WPF программа. Только будьте предупреждены, что есть 3 потока. Ввод, вывод и ошибка (которая обычно также отправляется в окно консоли). Все без показа консоли. Раньше это был обычный подход к управлению программами, которые выполнялись только из командной строки, но в настоящее время они в основном забыты за пределами мира Unix / Linux, так как почти все имеют внешний интерфейс.

Затем вы можете отобразить ввод/ вывод в метку, текстовое поле, richtTextBox или тому подобное, которые в основном ведут себя и выглядят как консольное окно, не будучи таковыми. И поскольку это окно выбранной вами технологии отображения, у вас есть все возможности для управления им.

...