win32 WM_NOTIFY 与 WM_COMMAND

R V*_*HAL 0 winapi

这是一个为控制win32 api中的消息而发布的理论问题。

WM_COMMAND和 和有WM_NOTIFY什么区别?我们什么时候需要处理这些消息,什么时候选择忽略它们?

产生这种疑问是因为这两个消息都是在用户与控件交互时发送的,并且都将相同的信息发送到事件类型的窗口过程,控件 Id 和控件句柄作为结构(LPNMHDR 在情况下WM_NOTIFY)或直接发送(LPARAM 句柄来控制和 LOWORD (WPARAM) 的情况下WM_COMMAND)

有了所有这些相似之处,为什么我们仍然将两者一起使用,而不仅仅是弃用一个?

Sor*_*tir 5

由于向后兼容的原因,我们同时使用两者。新控件倾向于使用 WM_NOTIFY(它的功能要强大得多),但存在发送 WM_COMMAND 的现有控件,MS 不会改变这一点。

我说 WM_NOTIFY 更有能力,因为它的 lParam 是 NMHDR *,如果 NMHDR 是 POD 类型(或现代 C++ 术语中的标准布局)的第一个成员,那么您可以将 lParam 转换为控件发送的实际类型. WM_COMMAND 所能提供的只是一个命令代码和窗口句柄。

至于何时处理它们,这完全是一个需要的问题,如果您需要处理特定控件的一部分上的特定操作,则您处理该消息,否则您不处理。

  • 这是对的。WM_COMMAND 较旧,与非常简单的控件(如按钮和菜单项)一起使用,以传达用户想要做的“事情”。WM_NOTIFY 是在 Windows 95 时代随新的通用控件一起出现的。因为它可以携带更多信息(通过指向结构的指针),所以它可以表达更复杂的交互,例如单击列表视图中的列标题。通过阅读特定控件的文档,您知道会获得哪种类型。 (3认同)
  • @RVISHAL“*有没有办法让任何旧式控件发送 WM_NOTIFY 消息*” - 没有。“*控制是特定的吗?*” - 是的。阅读每个控件的文档以了解详细信息 (2认同)