设置在WinForms应用程序中打开的控制台窗口的位置

时间:2009-10-10 19:23:00

标签: c# winforms console runtime window

我在Rex Logan发布的这个帖子中找到了一些源代码:SO:

link text

... Foredecker在同一个帖子中也发布了一些非常有趣的代码,但它不完整且复杂:我对'Trace工具不够了解,知道如何完全实现它。

我能够在WinForms应用程序中成功发布此控制台代码Rex(亲切),以记录各种事件,并将消息推送到调试中非常有用;我也可以从应用程序代码中清除它。

当我打开控制台窗口时(在主窗体加载事件中),我似乎无法做到可靠地设置控制台窗口的屏幕位置。如果我尝试设置像这样的WindowLeft或WindowTop属性,我得到编译阻塞System.ArgumentOutOfRangeException错误:

  

必须设置窗口位置   当前窗口大小适合   在控制台的缓冲区内,以及   数字不得为负数。   参数名称:左实际值为   #

但是,我可以设置WindowWidth和WindowHeight属性。

我尝试移动激活控制台各个位置的代码,包括:

    在MainForm为'run 之前的Program.cs文件中
  1. 在调用MainForm ctor
  2. 中的'InitializeComponent()之前和之后 表单加载事件中的
  3. 表格显示事件中的
  4. 控制台在代码中的所有这些位置都已激活,但看似随机切换屏幕左上象限的位置没有变化。

    控制台窗口打开的位置似乎随机变化(主窗体始终在屏幕上的同一位置初始化)。

1 个答案:

答案 0 :(得分:36)

你可以尝试这样的事情。

此代码在控制台应用程序中设置控制台窗口的位置。

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