c# - 你为什么要覆盖 wndproc

标签 c# overriding wndproc

我一直在四处寻找,并没有真正看到太多关于为什么有人会覆盖 wndproc 来处理消息的信息。

所以我想知道:

为什么要这样做?

什么时候做?

它在 C# 中的一般用途是什么?

当看到串行 COM 从计算机上插入和拔出时,我尝试使用它,但我觉得我更好地依赖自己创建的方法。

我看到的其他消息是关于按键、光标设置和其他各种操作的。这就是说这些东西中的大部分已经在 c# 库中内置了方法。所以我再次回到我的三个主要问题。任何信息、意见、示例等都很棒。

最佳答案

WndProc() 是 Windows 窗口工作方式的核心。它是围绕 窗口过程 的托管包装方法,该函数在过去曾用 C 语言编写。这是您自定义窗口行为的方式,使它对操作系统或其他程序生成的通知做出不同的响应。

您通常不需要覆盖它,基类中的 WndProc() 方法处理大部分基本通知。将它们变成友好的 .NET 事件,如 Click 等。但这还没有完成,要么是因为通知太模糊,要么是因为它无法了解自定义窗口使用的消息的任何信息。在这种情况下,您可以转而重写 WndProc() 来拦截消息。我能想到的最好的例子是创建一个无边界窗口来绘制自定义窗口框架并仍然使窗口正常运行。最简单的方法是拦截 WM_NCHITTEST 之类的消息,而不是被 .NET 包装。

真正理解 WndProc() 需要阅读 Petzold 的开创性书籍“Programming Windows”。今天可能不再那么容易掌握了,它确实假定您对 C 语言有基本的了解。这是 30 年前 winapi 的目标语言,当时面向对象的语言并未被广泛使用或可用。这也解释了为什么在 WndProc() 中编写代码相当痛苦,几乎没有抽象,您不能真正忽略指针。

从 Windows 8 和 WinRT api 开始,Microsoft 确实努力让其停用。不完全是 slamdunk 的成功,也许 Windows 10 会给它一些牵引力。使 WinRT 在幕后工作的基础技术是 COM,它是 C 的一大进步,因为它可以支持对象模型。尽管它很好地隐藏在友好的语言预测中,但 COM 编程是大多数程序员会尽量避免的事情:)

关于c# - 你为什么要覆盖 wndproc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30378758/

相关文章:

c# - 覆盖嵌套内部类中的运算符

c# - Web 浏览器控件 : how to suppress message: do you want to close this window

c++ - Winapi - WM_CLOSE 的替代品

windows - 查找 WndProc 地址

C# 列表删除不区分大小写

c# - C#中查找关键字最快的算法

c# - 从 NodeJs 上的 C# 读取二进制文件?

c# - 在 C# 中模拟方法级联

c - 包装来自静态库错误的函数调用

c++ - 通过覆盖 'new' 运算符,您获得了哪些有用的功能?