Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么要覆盖wndproc_C#_Overriding_Wndproc - Fatal编程技术网

C# 为什么要覆盖wndproc

C# 为什么要覆盖wndproc,c#,overriding,wndproc,C#,Overriding,Wndproc,我一直在四处寻找,并没有看到太多关于为什么有人会覆盖wndproc来处理消息的信息 所以我想知道: 为什么这样做? 什么时候做? 它在C#中的一般用途是什么? 当我看到串行COM从计算机上插拔时,我曾尝试过使用它,但我觉得我更好地依靠了我自己创建的方法 我看到的其他消息包括按键、光标设置和其他各种操作。尽管如此,这些东西中的大多数已经在c#库中内置了方法。因此,我再次回到我的三个主要问题。任何信息、观点、示例等都会非常棒。WndProc()是Windows窗口工作方式的核心。它是一种围绕窗口过程

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

所以我想知道:

为什么这样做?

什么时候做?

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

当我看到串行COM从计算机上插拔时,我曾尝试过使用它,但我觉得我更好地依靠了我自己创建的方法

我看到的其他消息包括按键、光标设置和其他各种操作。尽管如此,这些东西中的大多数已经在c#库中内置了方法。因此,我再次回到我的三个主要问题。任何信息、观点、示例等都会非常棒。

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

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

真正摸索WndProc()需要阅读Petzold的开创性著作“编程窗口”。也许现在已经不那么容易掌握了,但它确实需要对C语言有一个基本的理解。30年前winapi的目标语言是哪种,当时面向对象的语言没有得到广泛使用或可用。这也解释了为什么在WndProc()中编写代码是相当痛苦的,因为几乎没有抽象,并且不能真正忽略指针


从Windows8和WinRTAPI开始,微软确实努力让它退役。不完全是一个巨大的成功,也许Windows10会给它一些牵引力。使WinRT在幕后工作的基础技术是COM,这是C语言的一大进步,因为它可以支持对象模型。尽管COM编程很好地隐藏在友好的语言投影中,但它是大多数程序员都会尽量避免的:)

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


keypress、keyDown或KeyUp事件在从用户控件响应时非常挑剔(即使KeyPreview设置为true等等)。我发现,如果重写WndProc(),则处理该命令的控件的可靠性要高得多

该问题在meta上引用: