调整控制台事件的大小

时间:2015-07-17 03:26:26

标签: c# events console message wndproc

所以我认为窗口调整大小事件将通过winproc传递,我可能会弄错,希望收到有关控制台调整大小事件的通知。

我希望在调整大小时最大化控制台缓冲区,一旦完成它就会将其缩小回窗口大小,从而防止由于缓冲区小于窗口而导致溢出错误。

3 个答案:

答案 0 :(得分:4)

不幸的是,答案是您无法挂钩控制台的WndProc,因为it's in a separate, security-controlled process。间谍++可以挂钩其他进程' WndProcs读取窗口消息,Spy ++甚至无法读取控制台窗口消息。即使您可以解决安全问题,也不能使用C#挂钩另一个进程。

我在调整大小时具有完全相同的竞争条件。在Windows 10上情况更糟,因为调整窗口大小会重排文本并更改缓冲区宽度以及窗口宽度。 Console.BufferWidthConsole.BufferHeight和family是非原子的,如果在调整窗口大小时使用它们,则会抛出托管和非托管错误。

您可以通过Reading Input Buffer Events确定之后的大小调整,但这不会解决您的问题。您仍然会遇到并发问题。由于这不是一个钩子,你不能让调整大小等你完成Console类的非原子缓冲/窗口大小操作。

我认为处理竞争条件的唯一选择是重试循环,这就是我将要使用的。

while (true) try
{
    // Read and write the buffer size/location and window size/location and cursor position,
    // but be aware it will be rudely interrupted if the console is resized by the user.
}
catch (IOException) { }
catch (ArgumentOutOfRangeException) { }

答案 1 :(得分:-1)

1#您需要获得对控制台窗口的引用,有多种方法可以执行此操作:https://support.microsoft.com/en-us/kb/124103

2#你需要使用setwindowshookex SetWindowsHookEx in C#来挂钩你的WndProc

3#在WndProc https://msdn.microsoft.com/en-us/library/windows/desktop/ms632646(v=vs.85).aspx

中处理WM_SIZE消息

重要的是要注意,在SetWindowHookEx示例中,名为CallNextHookEx的人,因为钩子被链接。

他获取键盘消息的另一个完整示例http://blogs.msdn.com/b/toub/archive/2006/05/03/589423.aspx,但您可以执行相同操作来捕获大小事件。

还有一个 Capture all Windows Messages

答案 2 :(得分:-2)

您可以使用主题侦听和捕获Resize事件:

class Program
{
    private static bool _listnerOn;
    static void Main(string[] args)
    {
        Thread listner = new Thread(EventListnerWork);

        listner.Start();

        Console.WriteLine("Press a key to exit...");
        Console.ReadKey(true);

        _listnerOn = false;
        listner.Join();
    }

    static void ConsoleResizeEvent(int height, int width)
    {
        Console.WriteLine("Console Resize Event");
    }

    static void EventListnerWork()
    {
        Console.WriteLine("Listner is on");
        _listnerOn = true;
        int height = Console.WindowHeight;
        int width = Console.WindowWidth;
        while (_listnerOn)
        {
            if (height != Console.WindowHeight || width != Console.WindowWidth)
            {
                height = Console.WindowHeight;
                width = Console.WindowWidth;
                ConsoleResizeEvent(height,width);
            }

            Thread.Sleep(10); 
        }
        Console.WriteLine("Listner is off");

    }

}