在win32中创建自定义消息类型?

Bee*_*and 10 c c++ windows winapi

有没有办法在Win32中定义和发送自定义消息类型,以便被主消息处理程序捕获?例如,我的主消息处理程序捕获诸如WM_PAINT,WM_RESIZE,WM_LBUTTONDOWN等消息.我可以创建自己的WM_DOSOMETHING吗?如果是这样,我将如何发送此消息?

啊,我实际上刚刚发现这是在之前被问到的,但是,它并没有回答我实际发送此消息的方式.

Bob*_*ore 16

哇,让我们停下来想想......

首先,Windows本身在该WM_USER+n范围内发送消息,这就是为什么WM_APP被发明(我发现这很难).但它变得更糟......没有什么可以阻止表现糟糕的应用程序广播 WM_USER+nWM_APP+n消息,而且因为人类偷走了众神无限愚蠢的晶体,这确实发生在现实世界中.

所以,在我之后重复,唯一安全的信息是我自己定义的,只能看到自己.使用RegisterWindowMessage.即便如此,也不要信任.当我需要一个字符串来定义RegisterWindowMessage时,我使用GUIDGEN创建字符串并在生成的gobbledygook上放置一个人类可读的特定于应用程序的前缀,以帮助我区分代码中的多个消息.

打赌你的人类的愚蠢 - 这总是一个赢得赌注.

如果您想要了解整个主题的权威背景,请参阅此处.不,这不是我的网站,它是Joe Newcomer的.


ito*_*son 15

是.只需在WM_USER范围内声明一个常量,例如

#define WM_RETICULATE_SPLINES (WM_USER + 0x0001)
Run Code Online (Sandbox Code Playgroud)

您还可以使用RegisterWindowMessage API按名称注册消息.

然后,您可以使用SendMessage,PostMessage或其任何变体发送这些消息.

  • 这可能是明智的.WM_USER消息对于窗口类是私有的,而不是应用程序.所以,如果你的主窗口类定义WM_RETICULATE_SPLINES是WM_USER + 0×0001,然后发送消息到MyThirdPartyControl,该MyThirdPartyControl是随意解释,作为WM_SEND_RUDE_EMAIL_TO_BOSS_THEN_FORMAT_C.因此,仅将WM_USER用于窗口类中的通信,或者当您确定知道要发布到哪个窗口类时.否则,RWM更安全.有关详细信息,请参阅RWM文档. (7认同)
  • 如果使用#define,请确保使用括号(WM_USER + 0x0001),因此对新消息号执行的算术运算(按位运算,打包成高位字等)可正常工作. (3认同)
  • 见http://msdn.microsoft.com/en-us/library/ms644931%28VS.85%29.aspx用于消息号范围的描述; 根据你的问题,`WM_APP`可能比`WM_USER`更合适 (2认同)
  • 或者更好地将其声明为`const DWORD WM_RETICULATE_SPLINES =(WM_USER + 0x0001);` (2认同)