为什么要重写wndproc ?
本文关键字:wndproc 重写 为什么 | 更新日期: 2023-09-27 17:50:20
我一直在四处寻找,并没有真正看到很多关于为什么有人会重写wndproc来处理消息的信息。
所以我想知道:
为什么这么做?
什么时候做?
它在c#中的一般用途是什么?
当我看到一个串行COM从计算机上插入和拔出时,我尝试过使用它,但我觉得我更好地依赖于我自己创建的方法。
我看到的其他消息用于按键、光标设置和其他各种操作。也就是说,这些东西中的大多数已经在c#库中内置了方法。所以我又回到了我的三个主要问题。任何信息,意见,例子等都会很棒。
WndProc()是Windows窗口工作方式的核心。它是一个围绕窗口过程的托管包装方法,该函数在过去是用C编写的。这是一种自定义窗口行为的方式,使其对操作系统或其他程序生成的通知做出不同的响应。
你通常不需要重写它,在基类中的WndProc()方法处理大多数基本通知。将它们转换为友好的。net事件,如Click等。但这并不完全,要么是因为通知太模糊,要么是因为它无法了解自定义窗口所使用的消息。在这种情况下,你可以依靠重写WndProc()来拦截消息。我能想到的最好的例子是创建一个无边界的窗口来绘制自定义的窗口框架,并仍然给予窗口正常的行为。最容易做到的是拦截WM_NCHITTEST这样的消息,而不是由。net包装。
真正了解windowproc()需要阅读Petzold的开创性著作"Programming Windows"。也许现在不那么容易掌握了,它确实需要对C语言有基本的了解。这是30年前winapi的目标语言,当时面向对象语言并没有被广泛使用或可用。这也解释了为什么在WndProc()中编写代码是相当痛苦的,抽象很少,而且你不能真正忽略指针。
微软确实从Windows 8和WinRT api开始努力淘汰它。这并不是一个完全的成功,也许Windows 10会给它带来一些牵引力。使WinRT在底层工作的基础技术是COM,这是C语言的一大进步,因为它可以支持对象模型。尽管COM编程很好地隐藏在友好的语言投影中,但它是大多数程序员都会试图避免的:)
我发现它对于处理UserControl的按键事件很有用。
keypress, keyDown,或KeyUp事件在响应UserControl时是相当挑剔的(即使KeyPreview设置为true等等)。我发现,如果我覆盖WndProc(),我有更多的控制处理命令的可靠性。