Подтвердить что ты не робот

Настройка положения окна консоли, открытого в приложении WinForms

Я нашел некоторый исходный код в этой теме, отправленный Rex Logan здесь на SO:

текст ссылки

... есть также очень интересный код, размещенный в этом же потоке Foredecker, но он неполный и сложный: я недостаточно уверен в функции Trace, чтобы узнать, как его полностью реализовать...

Я могу использовать этот код консоли Rex (любезно), успешно опубликованный в приложении WinForms для регистрации различных событий и для ввода сообщений, которые полезны при отладке; Я также могу очистить его от кода приложения.

То, что я не могу сделать, это надежно установить положение экрана окна консоли при открытии окна консоли (в событии загрузки основной формы). Я получаю компиляцию, блокирующую ошибки System.ArgumentOutOfRangeException, если я пытаюсь установить свойства WindowLeft или WindowTop следующим образом:

Положение окна должно быть установлено таким образом что текущий размер окна подходит в буфере консоли и цифры не должны быть отрицательными. Имя параметра: слева Фактическое значение было #

Я могу, однако, установить свойства WindowWidth и WindowHeight.

Я попытался переместить код, который активирует различные местоположения консоли, включая:

  • в файле Program.cs до того, как MainForm будет запущен
  • до и после вызова функции InitializeComponent() в MainForm ctor
  • в событии загрузки формы
  • в событии Form Shown

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

В случае открытия окна консоли кажется случайным (основная форма всегда инициализируется в том же месте на экране).

4b9b3361

Ответ 1

вы можете попробовать что-то вроде этого.

Этот код устанавливает положение окна консоли в Консольном приложении.

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;


namespace ConsoleApplication10
{
  class Program
  {
    const int SWP_NOSIZE = 0x0001;


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

    private static IntPtr MyConsole = GetConsoleWindow();

    [DllImport("user32.dll", EntryPoint = "SetWindowPos")]
    public static extern IntPtr SetWindowPos(IntPtr hWnd, int hWndInsertAfter, int x, int Y, int cx, int cy, int wFlags);

    static void Main(string[] args)
    {
      int xpos = 300;
      int ypos = 300;
      SetWindowPos(MyConsole, 0, xpos, ypos, 0, 0, SWP_NOSIZE);
      Console.WriteLine("any text");
      Console.Read();
    }
  }
}

Этот код устанавливает положение окна консоли в приложении WinForm.

using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Runtime.InteropServices;


namespace WindowsFormsApplication10
{
  static class Program
  {

    const int SWP_NOSIZE = 0x0001;

    [System.Runtime.InteropServices.DllImport("kernel32.dll")]
    private static extern bool AllocConsole();

    [DllImport("user32.dll", EntryPoint = "SetWindowPos")]
    public static extern IntPtr SetWindowPos(IntPtr hWnd, int hWndInsertAfter, int x, int Y, int cx, int cy, int wFlags);

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

    [STAThread]
    static void Main()
    {
      AllocConsole();
      IntPtr MyConsole = GetConsoleWindow();
      int xpos = 1024;
      int ypos = 0;
      SetWindowPos(MyConsole, 0, xpos, ypos, 0, 0, SWP_NOSIZE);
      Console.WindowLeft=0;
      Console.WriteLine("text in my console");

      Application.EnableVisualStyles();
      Application.SetCompatibleTextRenderingDefault(false);
      Application.Run(new Form1());
    }
  }
}