你为什么要覆盖 wndproc

Why would you override wndproc

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

所以我想知道:

为什么要这样做?

什么时候做?

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

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

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

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

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

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

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

我发现它对于处理 UserControl 的按键事件很有用。

Keypress、keyDown 或 KeyUp 事件在响应 UserControl 时非常挑剔(即使 KeyPreview 设置为 true 等等)。我发现,如果我重写 WndProc(),我的控件处理命令的可靠性会更高。