以C++ Builder处理Windows 讯息(Message)

C++Builder 自定义消息 处理 总结 这几天忙着弄一个SSDT HOOK驱动,一环扣一环啊,无奈要去理解一下C++Builder是怎么定义自定义消息的。网上资料很多,看了几篇,觉得有必要总结下。也希望找到这篇文章的同志,可以省点力气...首先,简单讲一下C++Builder的消息机制,BCB的消息处理集成在每个控件类中,首先主窗口有一个最大的消息处理循环函数MainWndProc,这个函数针对一些由BCB特定的消息做处理,其他的则 阅读详情

·前言

虽然C++Builder为一RAD式的程式发展工具,程式设计师在大多数情况下不需理会Windows讯息的细节,只要将心思放在软体元件的事件处理函式即可。然而由於Windows作业系统终究是一个以讯息驱动的系统,因此架构其上的的应用程式自然无法自外於系统之外,在遭遇到C++Builder没有定义的事件时,Windows讯息处理能力仍然是C++Builder程式人不可或缺的能力。

不可否认地,C++Builder所提供的事件处理能力已具备了某一程度的完备性,然而我们也必须承认,在C++Buider建构的VCL美丽新世界中,仍然不免有漏网之鱼。例如使用者自定讯息的处理,Winsock讯息的处理及一些Windows讯息如WM_NC**** 系列的讯息都是C++Builder的物件模型所未包含的。

在本文中我将告诉你如何以C++Builder来处理Windows讯息,并透过此一能力,来达成在一般VCL元件所无法做到的功能。

何谓Window讯息(Message)

大家都知道 Windows是一套以讯息驱动(Message Driven)的作业系统。然而对於讯息本身却讳莫如深,只知其然而不知其所以然,虽然C++Builder将某些Windows讯息封装於事件 (Event)系统中,但身为一个Windows程式设计师,实有必要了解Windows的讯息系统。

所谓讯息是由Windows作业系统送往程式的事件。它是系统中各个物件沟通的方式,举例来说,当移动滑鼠、按下滑鼠键、改变视窗大小时,Windows都会送出讯息以通知程式。当然,为了要辨别事件的内容,Windows系统中定义了许多的讯息,如WM_PAINT,WM_CHAR等等。

当事件发生时,Windows会判断该事件必须由那个程式接收,然後将事件以讯息的方式送往程式的视窗中。虽然在Windows系统中包含了数以百计的事件,但是作业系统并没有为各个事件设计不同的讯息结构,而是以一个一般性的结构来描述讯息,这个结构在C++Builder就称是TMessage。

当然,随着事件的不同,对於讯息的解释也有所不同,在C++Builder中也为各种常用的讯息定义了专属的结构,你可以直接使用它们来解释讯息。这些讯息定义在C++Builder目录下的Include/vcl/messages.hpp中,你可以决定要自行解释TMessage参数或是直接将其转换成专属的结构。很抽象吗? 我举个例子吧,以WM_NCHITTEST讯息来说,C++Builder为它定义了TWMNCHitTest的专属结构,所以你可以直接经由它来得到XPos、YPos等值。或者你也可以直接由TMessage的LParam取得其值,端看你使用的方便。仔细观察TMessage及TWMNCHitTest两个结构,你会发现它们是等价的,也就是说它们的大小是一致的,因此你可以直接用强制转型互相转换(这有点类似union的方法)。

struct TMessage

{

    Cardinal Msg;

    union

    {

        struct

        {

            Word WParamLo;

            Word WParamHi;

            Word LParamLo;

            Word LParamHi;

            Word ResultLo;

            Word ResultHi;

        };

       struct

       {

            long WParam;

            long LParam;

            long Result;

        };

    };

};

struct TWMNCHitTest

{

    Cardinal Msg;

    long Unused;

    union

    {

        struct

        {

            Windows::TSmallPoint Pos;

            long Result;

        };

        struct

        {

            short XPos;

            short YPos;

        };

    };

} ;

在收到讯息後,程式必须处理该讯息,若是不处理,则可直接将它交给Windows的内定处理程序来处理之,若是程式需要传回值,也可以在此时传回,Windows会将该值传回给呼叫方。如此就完成了讯息传递的程序。

复杂吗?一点也不!了解Windows讯息系统的运作後,我们来看看可以利用它来做些什麽有趣的事吧!

用C#和VB.NET实现Office XP风格的菜单 好了,这些是题外话了。这种移植很枯燥,但可以很快熟悉新的Beta2的类库和函数,Show出来的菜单还不错,感觉是Office2000风格的菜单。最后一部分是制作VS.NET或XP风格的例子,上面那个例子的效果不能使我完全满意,然后我重新写了另外一个,不过我对最后的结果还不是很满意,因为我的没有上一个例子那么完整,例子中我只显示了这个风格的菜单,对于事件响应、状态栏更新、tooltips、菜单的状态(enabled state)等处理都没有考虑,我把这些归结为时间问题,并承诺自己下次把它做得更好。 阅读详情

相关推荐

一文详解声码器

声码器(Vocoder)是语音信号处理领域的核心技术,其本质是通过“分析 - 参数化 - 合成” 的闭环流程,实现语音的高效编码、转换或生成。它不仅是早期语音通信的关键工具,更是现代 AI 语音技术(如 TTS、语音转换)的核心组件。以下从原理、技术分类、关键模块、应用及发展趋势展开详细解析。

weixin_41413777的博客 1302

用C#和VS.NET实现Office XP风格的菜单

开始我会涉及到在Winform中最基本的一些菜单的概念。然后会有一个以前接触过的有关菜单的例子,它是For Beta 1的。老实说我没有想到Beta1 到Beta2有许多函数和命名空间发生了变化,以前我在Beta1中测试过这个例子,很顺利。这次在Beta2中会有许多错误,我提供了两个Project,一个是原来的Project的,一个是我修改后For Beta 2的。这种移植很枯燥,但可以很快熟悉新

lne818的专栏 1391

【Bug已解决】Auto mode cannot determine the safety of an action — Claude Code 自动模式安全判断失败解决方案

将已知安全的操作添加到白名单,分类器不再拦截这些操作。# 步骤 1:编辑 Claude Code 配置"Read","Write"EOF# 步骤 2:白名单中的操作将自动通过# 不在白名单中的操作仍需分类器判断# 步骤 3:重启 Claude Codeclaude方案适用场景推荐指数难度方案一:手动审批偶发回退,安全优先⭐⭐⭐⭐⭐低方案二:/compact 压缩上下文超限导致⭐⭐⭐⭐低方案三:拆分步骤复杂操作触发⭐⭐⭐⭐低方案四:跳过审批隔离环境,CI/CD。

博客 1万+

Windows消息概述

Windows消息概述

zhangchuan7758的博客 1135

C++Builder如何响应消息及自定义消息

C++Builder如何响应消息及自定义消息     Inprise(Borland) C++Builder中,可以象在Delphi中一样响应消息,只是看起来要稍 复杂一点。     对于系统已定义的消息,可以直接响应:   #define WM_MY_OPEN_CMDLINE_FILE (WM_USER+1) //进程间通讯的自定义消息 #define WM_MY_

diligentcat的专栏 1784

C++Builder消息运用

一、TApplication的OnMessage事件  OnMessage事件只处理消息队列中的消息,SendMessage()发送的消息不会被截获。  任何窗体接收到一个windows消息,都会触发一次此事件  函数原型:  typedef void __fastcall (__closure *TMessageEvent) (tagMSG &Msg,bool &Handled)

tbwork 1592

(笔记)C++ builder消息的运用

一、TApplication的OnMessage事件OnMessage事件只处理消息队列中的消息,SendMessage()发送的消息不会被截获。任何窗体接收到一个windows消息,都会触发一次此事件函数原型:typedef void __fastcall (__closure *TMessageEvent) (tagMSG &Msg,bool &Handled);Msg表示被截...

weixin_30689307的博客 490

如何将windows xp系统下的outlook express6.0的邮件,帐号及通迅录导入Office Outlook xp/2003/2007中

<br />如何将windows xp系统下的outlook express6.0的邮件,帐号及通迅录导入Office Outlook xp/2003/2007中<br />1、此帮助以Outlook express6.0简体中文版及Micorosoft Office Outlook 2003简体中文版为例进行说明:关于outlook express6.0的版本请参见下图:<br /><br />2、关于Micorosoft Office Outlook 2003简体中文版,请参见下图:<br /><br

I'm Nothing 1万+

在XP上将Office 2003升级到2010或并排运行

If you’re still running XP, currently have Office 2003 installed on your machine, and skipped Office 2007, you might want to upgrade to Office 2010. In this guide we will show you the upgrade process ...

culul01313的博客 541

Windows XP SP3环境下安装Office 2003必备组件

SPTIP.dll是Office 2003中与扫描器界面支持相关的动态链接库文件。它为Office软件提供了与扫描仪设备交互的能力,使得用户可以通过扫描仪直接将文档扫描到Word、Excel等Office组件中。这个DLL文件由微软提供,并在安装Office 2003时一同安装到系统中。如果SPTIP.dll文件丢失或损坏,可能导致扫描功能失效。在企业环境中,如果出现SPTIP.dll相关的问题,应首先检查与扫描仪的兼容性,然后尝试重新安装Office 2003或只安装相关的工具包。

weixin_35757191的博客 1142

C++ BUILDER 消息处理的深入探索

在本文中我將告訴你如何以C++Builder來處理Windows訊息,並透過此一能力,來達成在一般VCL元件所無法做到的功能。 何謂Window訊息(Message) 大家都知道 Windows是一套以訊息驅動(Message Driven)的作業系統。然而對於訊息本身卻諱莫如深,只知其然而不知其所以然,雖然C++Builder將某些Windows訊息封裝於事件(Event)系統中,但身為

peachblossom的专栏 1331

C++ Builder XE8 安卓开发之使用ini文件保存数据

开发安卓时,我们有时候需要保存应用程序的配置信息,以方面下次打开APP时不需要重新配置。阿秀我之前总结了一篇使用Memo控件保存数据的方法,可惜只能针对Memo,不能保存其他控件比如Edit的配置信息。下面内容我总结了另一种保存数据的方法——ini文件。 INI文件一种通用的配置文件格式,它像注册表一样分键和数据项。下面是后面例程INI配置文件的内容,它有一个键Config,在这个键下有

代码就是生产力!https://yannanxiu.cn/ 2860

C++ builder xe10改造CheckListBox组件使其显示完整内容(BCB)可以下载实例

#include <vcl.h> #pragma hdrstop #include "Unit2.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm2 *Fo...

lzksword的专栏 1046

C++Builder之Edit和Memo

C++Builder之文本编辑(Edit、Memo) 1、AnsiString中第一个字符的下标为1而不是0; 2、TEdit组件 A、PasswordChar属性 密码替代字符。如果TEdit组件用于密码输入时,可以通过设置此属性来实现。默认此 属性为0,即正常显示字符,如果用于密码输入,一般将其值改为’*’,这样不管在其中 输入什么字符,都只显示为星号,当然也可以设...

weixin_33885253的博客 551

c++开发Windows驱动程序步骤

请注意,驱动程序是系统级别的代码,因此需要非常小心地编写和测试它们,以避免对系统的损害。在Visual Studio中,可以创建一个新的Win32驱动程序项目,并将代码添加到其中。驱动程序可以使用C++或汇编语言进行编写,但是由于C++更加结构化和易于维护,因此建议采用C++进行编写。可以使用Visual Studio的调试工具来调试驱动程序,或者使用Windbg和Kd来进行内核级别的调试。安装Windows Driver Kit (WDK),该工具包包含了开发Windows驱动所需的所有工具和库文件。

wkk521000的博客 1921

(02)C++ builderWINDOWS系统服务编写与WINDOWS桌面程序调用

(中行雷威2018.3.12)(同一个世界,同一个梦想,交流学习C++Builder XE10,传承c++builder的魅力!欢迎各地朋友加入我的QQ群484979943,进群密码“BCB”,同时也请将该群号广为宣传,希望能够广集各方高手,共同进步。如需下载开发工具及源代码请加入我的QQ群)【阅读倡议】1、有问题请留言;2、没问题请点赞;3、看连载请加群;4、下源码请加群;【开发工具】1、C++...

路在脚下 2089

C++ builder 关于MessageDlg的用法

if(MessageDlg("要删除当前记录码?",mtConfirmation,TMsgButtons()<<mbYes<<mbNo,0)==mrYes) { ADOTable1->Delete(); }

lzksword的专栏 896

C - Windows Message Queue

Message queue is the basic fundamental of windows system. For each process, the system maintains a message queue. If something happens to this process, such as mouse click, text change, the system will

辞树 717

获取Builder C++或Dephi的消息框TMessageForm内容

见网上有关于为何SPY++不能获得ShowMessage创建的消息框内容的疑问。 查找相关线索,通过对ShowMessage的跟踪,发现: 1)ShowMessage显示出的消息框中的TEXT不来自于子控件2)ShowMessage实质上调用CreateMessageDialog3)而CreateMessageDialog内部是利用了DrawText(A/W)输出的

迷茫的探索 2003

西瓜成熟度识别数据集,13358张原始图,正确识别率98.8%,支持YOLO v9格式标注两个标记: ripe和unripe 识别成熟和未成熟的西瓜

西瓜成熟度识别数据集,13358张原始图,正确识别率98.8%,支持YOLO v9格式标注两个标记: ripe和unripe 识别成熟和未成熟的西瓜

上一篇: bcb点滴
下一篇: 动态链结函式库(DLL-Dynamic Linked Library)
iiprogram
博客等级 码龄25年 1066粉丝 1515原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值