What is the purpose of all Process* methods and all message#39;s filters?(所有进程*方法和所有消息筛选器的用途是什么?)
问题描述
我注意到WinForms有许多方法来处理命令或键(Process*()
)和(预)筛选系统的消息,但我仍然不清楚它们各自的用途。
官方文件有些晦涩难懂,我还没有找到任何明确和完整的回应。
我谈谈以下方法:
PreFilterMessage(ref Message m)
ProcessCmdKey(ref Message msg, Keys keyData)
WndProc(ref Message m)
ProcessDialogKey(Keys keyData)
PreProcessMessage(ref Message msg)
ProcessKeyMessage(ref Message m)
ProcessKeyPreview(ref Message m)
ProcessCmdKey
或ProcessDialogKey
),另一些用于截取消息(彼此)。但为什么有这么多方法呢?它们的用途和用例是什么?
我认为每个方法的执行顺序不同。
以下是我知道的(或我认为知道的):
PreFilterMessage
:首先拦截消息。您可以在此处停止以下所有方式的消息分发!ProcessCmdKey
:拦截所有键,甚至组合键、特殊键和命令键。用于检测整个窗体上的快捷键(如Ctrl+D)。您可以在此处停止分发密钥。WndProc
:过滤后第二次拦截消息?我只用它来检测用户是否点击了右上角的"X",但我想这在其他方法上也是可能的!ProcessDialogKey
:只截取一个键,可能在ProcessCmdKey
之后,控件的所有键的事件之前。PreProcessMessage
:WndProc
之前和PreFilterMessage
之后?我不知道为什么使用它。ProcessKeyMessage
:截取关键消息。似乎很少用到。ProcessKeyPreview
:在预览事件前截取密钥?也很少使用。
深入地说,我认为这是正确的执行顺序:
- 预过滤
- 筛选器
- 预处理
- 流程
- 事件
为什么这么多步骤?
如有任何信息或具体用例,我们将不胜感激!
推荐答案
本机Windows图形用户界面应用程序通常有一个消息循环,底层的winapi调用是GetMessage()。但是有许多窗口来获取消息,底层的winapi调用是DispatchMessage()。在.NET应用程序中,您只有一次对Application.Run()的调用,但有许多WndProc()方法,每个控件一个。它们中的大多数隐藏在.NET框架代码中,只有在您重写它时才公开。
通常需要挂钩到消息循环中,在消息被调度到控件并到达WndProc()之前拦截该消息。最明显的原因是键盘快捷键,无论哪个控件具有焦点,您都希望对其执行操作。如果您必须在每个控件上使用KeyDown来检测快捷键,这当然是非常痛苦的。还有一些不太明显的原因,例如,ActiveX控件因必须与其宿主协商而引人注目。WinForms提供了许多扩展点来拦截消息。真的是太多了,但这在某种程度上是不可避免的副作用,因为他们不想预测它们在哪些情况下可能有用。按顺序:
这篇关于所有进程*方法和所有消息筛选器的用途是什么?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:所有进程*方法和所有消息筛选器的用途是什么?
基础教程推荐
- c# Math.Sqrt 实现 2022-01-01
- 将 XML 转换为通用列表 2022-01-01
- MS Visual Studio .NET 的替代品 2022-01-01
- 如何激活MC67中的红灯 2022-01-01
- 将 Office 安装到 Windows 容器 (servercore:ltsc2019) 失败,错误代码为 17002 2022-01-01
- rabbitmq 的 REST API 2022-01-01
- 有没有办法忽略 2GB 文件上传的 maxRequestLength 限制? 2022-01-01
- 为什么Flurl.Http DownloadFileAsync/Http客户端GetAsync需要 2022-09-30
- SSE 浮点算术是否可重现? 2022-01-01
- 如何在 IDE 中获取 Xamarin Studio C# 输出? 2022-01-01