调整控制台的事件大小

Dav*_*rey 2 c# console events message wndproc

因此,我认为窗口调整大小事件将通过winproc来进行,我可能会弄错了,希望获得有关控制台调整大小事件的通知。

我想在调整大小时最大化控制台缓冲区,并在完成后实质上将其缩小到窗口大小,从而防止由于缓冲区小于窗口而导致溢出错误。

jnm*_*nm2 5

不幸的是,答案是您无法钩住控制台的WndProc,因为它处于单独的,受安全控制的过程中。Spy ++可以挂钩其他进程的WndProcs来读取窗口消息,而Spy ++甚至不能读取控制台窗口消息。即使您可以解决安全问题,也无法使用C#钩住另一个进程。

我在调整大小时具有完全相同的比赛条件。在Windows 10上更糟糕,因为调整窗口大小会重新排列文本并更改缓冲区宽度以及窗口宽度。Console.BufferWidthConsole.BufferHeight和家人都非原子,如果你使用他们,而被调整窗口大小时将抛出托管和非托管错误。

您肯定可以在事后通过读取输入缓冲区事件来了解有关调整大小的信息但这无法解决您的问题。您仍然会遇到并发问题。由于这不是一个钩子,因此您无法让调整大小等待您完成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) { }
Run Code Online (Sandbox Code Playgroud)