所以我认为窗口调整大小事件将通过 winproc 进行,我可能是错误的,希望获得控制台调整大小事件的通知。
我想在调整大小时最大化控制台缓冲区,一旦完成,基本上将其缩小回窗口大小,从而防止由于缓冲区小于窗口而导致溢出错误。
不幸的是,答案是你无法挂钩控制台的 WndProc 因为它位于一个单独的、安全控制的进程中 https://stackoverflow.com/a/13438939/521757。 Spy++可以hook其他进程的WndProcs来读取窗口消息,而Spy++甚至无法读取控制台窗口消息。即使您可以解决安全问题,C# 也不能用于挂钩另一个进程。
我在调整大小时遇到完全相同的竞争条件。在 Windows 10 上情况更糟,因为调整窗口大小会重排文本并更改缓冲区宽度和窗口宽度。Console.BufferWidth
, Console.BufferHeight
和 family 是非原子的,如果在调整窗口大小时使用它们,将会抛出托管和非托管错误。
您绝对可以找到有关调整大小的信息事后 by 读取输入缓冲区事件 https://msdn.microsoft.com/en-us/library/windows/desktop/ms685035.aspx但这并不能解决你的问题。您仍然会遇到并发问题。因为这不是一个钩子,所以你不能让调整大小等待你完成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) { }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)