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#MongoDB使用Builders查找派生对象 2022-09-04
- 在哪里可以找到使用中的C#/XML文档注释的好例子? 2022-01-01
- Web Api 中的 Swagger .netcore 3.1,使用 swagger UI 设置日期时间格式 2022-01-01
- WebMatrix WebSecurity PasswordSalt 2022-01-01
- 如何用自己压缩一个 IEnumerable 2022-01-01
- C# 中多线程网络服务器的模式 2022-01-01
- 良好实践:如何重用 .csproj 和 .sln 文件来为 CI 创建 2022-01-01
- 输入按键事件处理程序 2022-01-01
- MoreLinq maxBy vs LINQ max + where 2022-01-01
- 带有服务/守护程序应用程序的 Microsoft Graph CSharp SDK 和 OneDrive for Business - 配额方面返回 null 2022-01-01