为什么要覆盖wndproc

时间:2015-05-21 15:56:11

标签: c# override wndproc

我一直在环顾四周,并没有真正看到有关为什么有人会覆盖wndproc来处理邮件的信息。

所以我想知道:

为什么这样做?

什么时候开始?

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

我在尝试使用它时,尝试使用它,但是我觉得我更好地依赖于我自己制作的方法。

我看到的其他消息包括按键,光标设置和其他各种操作。据说大多数这些东西已经在c#库中内置了方法。所以我再回到我的三个主要问题。任何信息,意见,例子等都会很棒。

2 个答案:

答案 0 :(得分:12)

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

您通常不需要覆盖它,基类中的WndProc()方法处理大多数基本通知。将它们转换为友好的.NET事件,例如Click等。但这并不完整,因为通知太模糊或必然如此,因为它无法了解自定义窗口使用的消息。在这种情况下,您可以回退覆盖WndProc()来拦截消息。我能想到的最好的例子是创建一个无边框窗口来绘制自定义窗口框架并仍然给出窗口正常行为。最容易通过截取WM_NCHITTEST之类的消息来完成,而不是由.NET包装。

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

从Windows 8和WinRT api开始,微软确实努力退出它。不完全是一个满贯的成功,也许Windows 10会给它带来一些牵引力。使WinRT工作的基础技术是COM,这是C的一大进步,因为它可以支持对象模型。虽然它很好地隐藏在友好的语言预测中,COM编程是大多数程序员都会试图避免的:)

答案 1 :(得分:0)

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

从UserControl响应时,keypress,keyDown或KeyUp事件非常挑剔(即使将KeyPreview设置为true也是如此)。我发现如果我重写WndProc(),我有更多的可靠性控制处理命令。

相关问题