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

fnatzsnv  于 2022-11-17  发布在  其他
关注(0)|答案(1)|浏览(154)

我发现一些源代码在这个线程张贴雷克斯洛根在这里的SO:
link text

  • ...... Foredecker在同一个线程中发布了一些非常有趣的代码,但这些代码不完整且复杂:我对"Trace“工具还不够了解,不知道如何完全实现它... *

我能够使用这个控制台代码雷克斯(友好地)成功地发布在WinForms应用程序中,以记录各种事件,并将消息推送到调试中有用的位置;我也可以从应用程序代码中清除它。
当我打开控制台窗口(在Main Form load事件中)时,我似乎无法可靠地设置控制台窗口的屏幕位置。如果我试图像这样设置WindowLeft或WindowTop属性,我会得到编译阻塞System.ArgumentOutOfRangeException错误:
窗口位置必须设置为当前窗口大小适合控制台的缓冲区,并且数字不能为负数。参数名:left实际值为#
但是,我可以设置WindowWidth和WindowHeight属性。
我已尝试将激活控制台的代码移动到不同位置,包括:
1.在“运行”MainForm之前在Program.cs文件中
1.调用MainForm ctor中的“InitializeComponent()”之前和之后
1.在Form Load事件中
1.在显示的表单事件中
控制台在代码中的所有这些地方都被激活了,但是在屏幕左上角的区域似乎是随机切换的。
控制台窗口打开的位置似乎随机变化(主窗体总是在屏幕上的同一位置初始化)。

ryevplcw

ryevplcw1#

你可以试试这样东西。
此代码设置控制台窗口在控制台应用程序中的位置。

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

相关问题