c# - 控制台的调整大小事件

标签 c# events console message wndproc

所以我认为窗口调整大小事件将通过 winproc 发生,我可能错了,希望得到控制台调整大小事件的通知。

我想在调整大小时最大化控制台缓冲区,并且一旦它完成基本上缩小回窗口大小,从而防止由于缓冲区小于窗口而导致的溢出错误。

最佳答案

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

我在调整大小时遇到​​了完全相同的竞争条件。在 Windows 10 上情况更糟,因为调整窗口大小会重排文本并更改缓冲区宽度和窗口宽度。 Console.BufferWidthConsole.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/

相关文章:

java - component.get MouseMotionListener 返回多个

c - 如何在电影院中标记已占座位。 C编程

c# - 如何将文本 block 属性继承到 C# 中的自定义控件

c# - 事件通知引擎 - MSMQ

c# - 文件流.读取(...): Will I ever get a nibble rather than byte?

c# - 动态数据模板 silverlight 事件

python - 如何获取 tkinter 文本小部件中最后一行的内容(Python 3)

sql - Sybase - 设置控制台输出以打印日志语句

c# - 从 app.config 获取 WCF 客户端端点 IP

c# - 如何在ColdFusion中重写此.Net C#?