为什么要覆盖wndproc

Jos*_*vis 10 c# overriding wndproc

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

所以我想知道:

为什么这样?

什么时候做?

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

当我看到从计算机上插入并拔下插头的串行COM时,我已经尝试过使用它,但我觉得我更好地依赖于我自己创建的方法.

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

Han*_*ant 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编程是大多数程序员会试图避免的:)