如何定义私有基础应用程序消息?

 井上英精_824 发布于 2023-02-10 12:42

我正在我的应用程序中使用私人消息,如下所示:

UM_APP_BASE = WM_APP; // WM_APP is declared as WM_APP = $8000; in "Controls" unit.

然后定义我的私信:

UM_EXPLORER_MSG = UM_APP_BASE + 1;
UM_LICENSE_CHANGE_MSG = UM_APP_BASE + 2;
etc...

在我的课堂上使用它们:

procedure UMLicenseChanged(var Message: TMessage); message UM_LICENSE_CHANGE_MSG;

(我也RegisterWindowMessage习惯和其他应用程序"交谈"但这是一个不同的故事)

我不记得是什么让我决定使用WM_APP而不是WM_USER作为基础.
文档说:

WM_USER常量用于区分保留供Windows使用的消息值和应用程序可用于在私有窗口类中发送消息的值.有五种消息编号范围:

Range   Meaning
0 through WM_USER - 1   Messages reserved for use by Windows.
WM_USER through 0x7FFF  Integer messages for use by private window classes.
0x8000 through 0xBFFF   Messages reserved for future use by Windows.
0xC000 through 0xFFFF   String messages for use by applications.
Greater than 0xFFFF Reserved by Windows for future use.

这意味着WM_APP"保留供Windows将来使用".另一方面,Delphi使用的CM_BASE = $B000;是该范围内的.并且CN_BASE = $BC00;

如何定义基本消息,以便它不会与Windows/Delphi/Other控件使用的其他消息冲突?哪个基本消息首选为我的应用程序的私有消息?为什么?
我应该用WM_USER而不是WM_APP吗?请注意,WM_USERWindows也可以在CommCtrl中使用base TB_ENABLEBUTTON = WM_USER + 1.等等...

我需要一些关于这个问题的见解.


我在Delphi帮助API(D5)上阅读了这篇文章.这显然已经过时了!
这可能就是我决定使用的原因WM_APP.
不过,关于两者之间差异的解释会很好:)

1 个回答
  • 我不确定你的信息来自哪里.MSDN 文档说:

    0到WM_USER -1
    保留供系统使用的消息.

    WM_USER到0x7FFF
    由私有窗口类使用的整数消息.

    WM_APP(0x8000)到0xBFFF
    可供应用程序使用的消息.

    0xC000到0xFFFF
    应用程序使用的字符串消息.

    大于0xFFFF
    由系统保留.


    现在,WM_USER范围和WM_APP范围之间有什么区别?许多地方已经涵盖了这一点.例如,Raymond Chen就是这么说的.

    0x400 .. 0x7FFF(WM_USER .. WM_APP-1):类定义的消息.

    这些消息的含义由窗口类的实现者确定.(非正式地:由为该窗口类调用RegisterClass的人.)例如,如果窗口是工具栏控件,则WM_USER + 1消息表示TB_ENABLEBUTTON,但如果它是工具提示控件则表示TTM_ACTIVATE,如果它是DM_SETDEFID则表示是一个对话框.如果您创建了自己的控件,那将意味着其他完全不同的东西.由于任何人都可以在此范围内创建消息,因此操作系统不知道参数的含义并且无法执行自动编组.

    0x8000 .. 0xBFFF(WM_APP ... MAXINTATOM-1):应用程序定义的消息.

    这些消息的含义由创建窗口的应用程序确定.(非正式:由调用CreateWindow的人.)此消息区域是在Windows 95中创建的,以确保子窗口和生成自定义消息的应用程序不会干扰未来版本中窗口类创建的新消息.同样,由于任何人都可以在此范围内创建消息,因此操作系统不知道参数的含义并且无法执行自动编组.

    从这一切中得出的主要内容是,如果您在WM_USER范围内定义消息,那么请为应用程序中的其他控件做好准备,以便自己使用这些消息.例如,您不得在WM_USER范围内广播消息.

    另一方面,WM_APP范围中的消息旨在对应用程序中的所有不同窗口类具有相同的含义.

    2023-02-10 12:44 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有