Nagits's Blog

programming, fizfak science, etc…

C# Console resizing (изменяем размер консольного окошка)

with one comment

Наверное, не новость для тех, кто с этим сталкивался, что из программы изменить размер консольного окна просто как 2х2 не получится.

Какое же разочарование, когда нельзя написать «Console.Height = 600». Да и Console.SetWindowSize не больно-то помогает.  :-), да-а, совсем на С# горе-программисты разленились. Сегодня вот и я столкнулся с этой проблемкой. А сейчас как раз и расскажу, как она решается.

Возможно, вы обратили свое внимание на функцию Console.SetWindowSize. И вероятно, она вывалилась в ArgumentOutOfRangeException. Давайте глянем, что нам пишет об этом MSDN:

ArgumentOutOfRangeException Значение параметра width или height меньше или равно нулю.

– или –

Сумма width и WindowLeft либо сумма height и WindowTop больше или равна Int16.MaxValue.

– или –

Значение параметра width или height больше ширины или высоты окна максимально возможной при текущем разрешении и шрифте консоли.

Третья причина обычно и создает проблему.

Для решения приходится воспользоваться WinAPI, о котором совсем уже все позабыли, как тока перешли на C#.

Нужная нам функция

bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);

находится в user32.dll, которую надо импортировать в наше консольное приложение. Делается это просто:

[System.Runtime.InteropServices.DllImport("user32.dll")]
bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);

Первый параметр hWnd (дескриптор вашего окошка) добываете с помощью

IntPtr ConsoleHandle = System.Diagnostics.Process.GetCurrentProcess().MainWindowHandle;

Второй параметр отвечает за положение вашего окна по оси z (нормальное состояние или выше всех, например)

В качестве этого параметра можно указать одно из трех

static readonly IntPtr HWND_TOPMOST = new IntPtr(-1);
static readonly IntPtr HWND_NOTOPMOST = new IntPtr(-2);
static readonly IntPtr HWND_TOP = new IntPtr(0);

Так, идем дальше.. задаем новое положение окна переменными X,Y и размеры с помощью переменных cx, cy.

Последним параметром мы задаем флаги для окна, я их приведу, но описывать не буду, посмотрите на msdn.

const UInt32 SWP_NOSIZE = 0x0001;
const UInt32 SWP_NOMOVE = 0x0002;
const UInt32 SWP_NOZORDER = 0x0004;
const UInt32 SWP_NOREDRAW = 0x0008;
const UInt32 SWP_NOACTIVATE = 0x0010;
const UInt32 SWP_FRAMECHANGED = 0x0020;
const UInt32 SWP_SHOWWINDOW = 0x0040;
const UInt32 SWP_HIDEWINDOW = 0x0080;
const UInt32 SWP_NOCOPYBITS = 0x0100;
const UInt32 SWP_NOOWNERZORDER = 0x0200;
const UInt32 SWP_NOSENDCHANGING = 0x0400;

Задать их можете например, так

const UInt32 WINDOW_FLAGS = SWP_NOZORDER | SWP_NOSIZE;

Приведу рабочий код:

static readonly IntPtr HWND_TOPMOST = new IntPtr(-1);
static readonly IntPtr HWND_NOTOPMOST = new IntPtr(-2);
static readonly IntPtr HWND_TOP = new IntPtr(0);
const UInt32 SWP_NOSIZE = 0x0001;
const UInt32 SWP_NOMOVE = 0x0002;
const UInt32 SWP_NOZORDER = 0x0004;
const UInt32 SWP_NOREDRAW = 0x0008;
const UInt32 SWP_NOACTIVATE = 0x0010;
const UInt32 SWP_FRAMECHANGED = 0x0020;
const UInt32 SWP_SHOWWINDOW = 0x0040;
const UInt32 SWP_HIDEWINDOW = 0x0080;
const UInt32 SWP_NOCOPYBITS = 0x0100;
const UInt32 SWP_NOOWNERZORDER = 0x0200;
const UInt32 SWP_NOSENDCHANGING = 0x0400;
[System.Runtime.InteropServices.DllImport("user32.dll")]
 static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);

[STAThread]
static void Main(string[] args)
{
   IntPtr ConsoleHandle = System.Diagnostics.Process.GetCurrentProcess().MainWindowHandle;
   const UInt32 WINDOW_FLAGS = SWP_SHOWWINDOW;
   SetWindowPos(ConsoleHandle, HWND_NOTOPMOST, 0, 0, 700, 600, WINDOW_FLAGS);
   Console.ReadLine();
}

Ну и, вдогонку, если вдруг кому пригодится, для минимизации или максимизации окна импортируете функцию из той-же user32.dll:

[System.Runtime.InteropServices.DllImport("user32.dll")]
 private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
 private const int SW_MINIMIZE = 6;
 private const int SW_MAXIMIZE = 3;

Следующий код развернет консольное окошко на половину экрана (больше для консоли — нельзя):

ShowWindow(ConsoleHandle, SW_MAXIMIZE);
Advertisements

Written by nagits

Май 19, 2010 в 18:35

Опубликовано в C#, Программирование

Tagged with , ,

Один ответ

Subscribe to comments with RSS.

  1. Just want to say what a great blog you got here!
    I’ve been around for quite a lot of time, but finally decided to show my appreciation of your work!

    Thumbs up, and keep it going!

    Cheers
    Christian, iwspo.net

    neateeshy

    Май 30, 2010 at 09:48


Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

%d такие блоггеры, как: