所以我认为窗口调整大小事件将通过 winproc 发生,我可能错了,希望得到控制台调整大小事件的通知。
我想在调整大小时最大化控制台缓冲区,并且一旦它完成基本上缩小回窗口大小,从而防止由于缓冲区小于窗口而导致的溢出错误。
最佳答案
不幸的是,答案是你不能 Hook 控制台的 WndProc 因为 it's in a separate, security-controlled process . Spy++可以hook其他进程的WndProcs来读取窗口消息,而Spy++甚至不能读取控制台窗口消息。即使您可以解决安全问题,C# 也不能用于 Hook 另一个进程。
我在调整大小时遇到了完全相同的竞争条件。在 Windows 10 上情况更糟,因为调整窗口大小会重排文本并更改缓冲区宽度和窗口宽度。 Console.BufferWidth
、Console.BufferHeight
和系列是非原子的,如果您在调整窗口大小时使用它们,将会抛出托管和非托管错误。
您绝对可以通过 Reading Input Buffer Events 了解有关事后 调整大小的信息但这不能解决你的问题。您仍然会遇到并发问题。由于这不是一个钩子(Hook),您不能让调整大小等待您完成 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) { }
关于c# - 控制台的调整大小事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31467941/