所有进程*方法和所有消息筛选器的用途是什么? [英] What is the purpose of all Process* methods and all message's filters?

查看:31
本文介绍了所有进程*方法和所有消息筛选器的用途是什么?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我注意到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)
一些用于截取键(如ProcessCmdKeyProcessDialogKey),另一些用于截取消息(彼此)。但为什么有这么多方法呢?它们的用途和用例是什么?

我认为每个方法的执行顺序不同。

以下是我知道的(或我认为知道的):

  • PreFilterMessage:首先拦截消息。您可以在此处停止以下所有方式的消息分发!
  • ProcessCmdKey:拦截所有键,甚至组合键、特殊键和命令键。用于检测整个窗体上的快捷键(如Ctrl+D)。您可以在此处停止分发密钥。
  • WndProc:过滤后第二次拦截消息?我只用它来检测用户是否点击了右上角的"X",但我想这在其他方法上也是可能的!
  • ProcessDialogKey:只截取一个键,可能在ProcessCmdKey之后,控件的所有键的事件之前。
  • PreProcessMessageWndProc之前和PreFilterMessage之后?我不知道为什么使用它。
  • ProcessKeyMessage:截取关键消息。似乎很少用到。
  • ProcessKeyPreview:在预览事件前截取密钥?也很少使用。

深入地说,我认为这是正确的执行顺序:

  1. 预过滤
  2. 筛选器
  3. 预处理
  4. 流程
  5. 事件

为什么这么多步骤?

如有任何信息或具体用例,我们将不胜感激!

推荐答案

本机Windows图形用户界面应用程序通常有一个消息循环,底层的winapi调用是GetMessage()。但是有许多窗口来获取消息,底层的winapi调用是DispatchMessage()。在.NET应用程序中,您只有一次对Application.Run()的调用,但有许多WndProc()方法,每个控件一个。它们中的大多数隐藏在.NET框架代码中,只有在您重写它时才公开。

通常需要挂钩到消息循环中,在消息被调度到控件并到达WndProc()之前拦截该消息。最明显的原因是键盘快捷键,无论哪个控件具有焦点,您都希望对其执行操作。如果您必须在每个控件上使用KeyDown来检测快捷键,这当然是非常痛苦的。还有一些不太明显的原因,例如,ActiveX控件因必须与其宿主协商而引人注目。

WinForms提供了许多扩展点来拦截消息。真的是太多了,但这在某种程度上是不可避免的副作用,因为他们不想预测它们在哪些情况下可能有用。按顺序:

这篇关于所有进程*方法和所有消息筛选器的用途是什么?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆