Установка положения Консольного окна, открытого в приложении WinForms - PullRequest
17 голосов
/ 10 октября 2009

Я нашел некоторый исходный код в этой теме, опубликованный Рексом Логаном здесь на SO:

текст ссылки

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

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

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

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

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

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

  1. в файле Program.cs до того, как MainForm будет запущена
  2. до и после вызова 'InitializeComponent () в ctor MainForm
  3. в событии загрузки формы
  4. в форме Показано событие

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

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

1 Ответ

36 голосов
/ 10 октября 2009

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

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

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());
    }
  }
}
...