用 C++Builder 编写 Tray 程序

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情

  Tray(托盘)是Windows9x任务条上的一个特殊区域,它的技术名称为“任务栏布告区”,一些软件(如金山词霸Ⅲ)运行时会在托盘上放置一个图标,使用户一眼就能知道这个程序正在后台运行,要想激活它也很容易,通常只需单击一下这个图标即可,非常方便。 
  Tray的编程比较特殊,但并不难,主要包括图标、工具提示和消息等三个方面,它是Shell编程的一部分。ShellAPI提供了Shell—NotifyIcon函数,用它可以增加、删除或者修改托盘中的图标,在托盘上放置图标后,Windows Shell会负责把发生在图标上的鼠标事件通知应用程序。Shell—NotifyIcon函数定义如下: 

  WINSHELLAPI BOOL WINAPI Shell—NotifyIcon(DWORD dwMessage,PNOTIFYICONDATA pnid); 

  dwMessage表示要完成的操作:NIM—ADD(增加图标)、NIM—DELETE(删除图标)、NIM—MODIFY(修改图标或提示文本),pnid是一个指向NOTIFYICONDATA结构的指针,结构的定义如下: 

typedef struct —NOTIFYICONDATA{ 
    DWORD cbSize;//结构所占的字节数,必须用结构的大小来初始化。 
    HWND hWnd;//接受Tray图标消息的窗口句柄 
    UINT uID;//由应用程序定义的图标ID 
    UINT uFlags;//用来鉴别那些需要改变其值的域,
        //NIF_ICON表示hIcon有效,可用来修改图标,
        //NIF_MESSAGE表示uCallbackMessage有效,用来定义消息,
        //NIF—TIP表示szTip参数有效,可修改工具提示。 
    UINT uCallbackMessage;//应用程序定义的消息 
    HICON hIcon;//Tray图标的句柄 
    char szTip[64];//工具提示的文本 
} NOTIFYICONDATA; 

  下面我们就通过一个具体例子来说明实现方法,程序运行时不会显示主窗体,只在托盘上增加一个图标,双击图标可关闭程序。

  新建一个工程,放置一个Timer控件到窗体上。打开unit1.h文件,增加头文件说明#include <shellapi.h>,在TForm1定义的private段增加一些数据成员和方法的声明: 

    unsigned int iconmessage;//定义的消息 
    void AddTrayIcon();//在托盘上增加图标 
    void RemoveTrayIcon();//从托盘中删除图标 

  由于要增加对自定义消息的处理,所以必须重载窗口过程函数WndProc,在TForm1的定义中增加protected段:virtual void ——fastcall WndProc(Messages::Tmessage& Message); 

  在unit1.cpp中定义相应的成员函数: 

void TForm1::AddTrayIcon() 
{
    NOTIFYICONDATA icondata; 
    memset(&icondata,0,sizeof(icondata)); 
   
    //将结构icondata的各域初始化为0 
    icondata.cbSize=sizeof(icondata); 
    icondata.hWnd=Handle; 
    strncpy(icondata.szTip,″未知状态″,sizeof(icondata.szTip)); 
    icondata.hIcon=Application->Icon->Handle; 
    icondata.uCallbackMessage=iconmessage; 
    icondata.uFlags=NIF—MESSAGE|NIF—ICON|NIF—TIP; 
    Shell—NotifyIcon(NIM—ADD,&icondata); 

void TForm1::RemoveTrayIcon() 

    NOTIFYICONDATA icondata; 
    memset(&icondata,0,sizeof(icondata)); 
    icondata.cbSize=sizeof(icondata); 
    icondata.hWnd=Handle; 
    Shell—NotifyIcon(NIM—DELETE,&icondata); 

重载TForm1的WndProc函数,加入对自定义消息的处理代码,这其实相当于创建了TForm类的子类。 

void __fastcall TForm1::WndProc(Messages::TMessage& Message) 

    if(Message.Msg==iconmessage) 
    { 
        if(Message.LParam==WM—LBUTTONDBLCLK) 
        { 
            Application->Terminate(); 
            //如果双击图标,则关闭应用程序 
        } 
        return; 
    } 
    TForm::WndProc(Message);//对于其他的消息,调用基础类的WndProc函数让Windows进行缺省处理。 

创建窗体的OnCreate事件句柄: 

void __fastcall TForm1::FormCreate(TObject *Sender) 

    iconmessage=RegisterWindowMessage(″IconNotify″); 
    AddTrayIcon(); 

这里通过调用RegisterWindowMessage函数来定义一个用户消息,也可以通过WM_USER+n来获得一个系统没有使用的消息编号。 

void __fastcall TForm1::FormDestroy(TObject *Sender) 

    RemoveTrayIcon(); 
    //窗体在关闭时删除托盘中的图标 

编写Timer1的Timer事件代码,当用户将鼠标停留在图标上时,显示提示文本: 

void __fastcall TForm1::Timer1Timer(TObject *Sender) 

    NOTIFYICONDATA icondata; 
    memset (&icondata, 0, sizeof (icondata)); 
    icondata.cbSize = sizeof (icondata); 
    icondata.hWnd = Handle; 
    String s=″我的图标!″;//定义提示文本 
    strncpy (icondata.szTip, s.c_str(), sizeof (icondata.szTip)); 
    icondata.uFlags = NIF—TIP ; 
    Shell—NotifyIcon (NIM—MODIFY,&icondata); 

  程序运行时不显示主窗体,只在托盘上放置相应的程序图标,从C++ Builder主选单中选择View|Project Source,在WinMain函数的Application→Initialize()语句后增加代码: 

    ShowWindow(Application→Handle,SW—HIDE); 
    Application→ShowMainForm=false; 

  按F9编译并运行程序,托盘上就会出现相应的图标。以上代码在C++ Builder3、Pwin98环境下编译、运行通过。 

-=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=-
             //
  __________/LB/___   OUTINN
 /  _[]_   /____/  /
/_________/| () |/__/  http://outinn.yeah.net/
 |  ____ /-| __ |-/|  Welcome to visit OUTINN!
 |__|==|___| || |__|
 -=--=--=- |_||_| =-  Fancy,  outinn@china.com
C++Builder 实现功能比较完整的托盘程序 .h file        void __fastcall TForm1::WndProc(Messages::TMessage& Message);//回调函数        void __fastcall TForm1::AddTrayIcon();//添加托盘        void __fastcall TForm1::RemoveTrayIcon();//移除托盘        voi 阅读详情

相关推荐

Electron+Vue/Next构建本地AI协作工作流实战指南

Electron 是构建桌面级 AI 应用的关键运行时,它突破浏览器沙箱限制,提供文件系统直通、本地模型进程托管和系统级交互能力。其核心原理在于主进程(Node.js)与渲染进程(Web)的分离架构,配合 preload.js 实现安全可控的上下文桥接。技术价值体现在隐私保护(敏感代码不上传)、低延迟响应(绕过网络往返)和深度系统集成(快捷键、托盘、GPU 加速)。典型应用场景包括本地代码补全、离线文档摘要、边缘侧人证核验等 AI 协作工具。本文聚焦 CodePilot 类项目落地全过程,覆盖 Electr

weixin_34320159的博客 357

C++ builder托盘程序Demo

C++ builder6开发的,实现在右下角托盘区程序开发的demo,简单实用。

Electron跨平台开发实战:从入门到工程化

跨平台桌面应用开发是当前企业级应用的重要需求,Electron框架通过整合Chromium和Node.js运行时,使开发者能够使用Web技术栈构建原生体验的桌面应用。其核心原理基于主进程与渲染进程分离的架构设计,通过IPC机制实现进程间通信。这种技术方案特别适合需要快速迭代、多平台部署的场景,如开发工具、效率应用和企业内部系统。在实际工程实践中,Electron与Vue、React等现代前端框架的无缝集成,以及通过electron-builder实现的自动化打包分发,大大提升了开发效率。本文以工业控制界面和

weixin_34280237的博客 407

C++Builder 编写 Tray 程序 (转)

C++Builder 编写 Tray 程序 (转)[@more@]  Tray(托盘)是windows9x任务条上的一个特殊区域,它的技术名称为“任务栏布告区”,一些软件(如金山词霸Ⅲ)运行时会在托盘上放置一个图标,使用户一...

csd3176的博客 138

BCB中TrayIcon组件的使用

其实,在   Borland   C++   Builder   5.0   中编写Tray程序是件很简单的事。在安装   Borland   C++   Builder   5.0   时选择Full(完全)安装,安装完成后,在Samples组件页中有一个TrayIcon组件,它封装编写Tary所需的Window   API函数,使用该组件编写Tary程序不用加一句程序代码,真是易如反掌。  

Persistence Produces Miracles 4095

c++builder Form重载WindowProc、WndProc 截获消息

c++builder 重载WindowProc、WndProc 截获消息  方法一WindowProc void __fastcall  myWindowProc(Messages::TMessage &amp;msg); //增加Classes::TWndMethod OldWindowProc;  //增加   void __fastcall  TForm1::myWindowProc...

weixin_34198762的博客 407

C++ Builder 6.0 消息重载的处理

要创建模板生成的程序,就要使用RectTrack,进行组件拖放,动态创建各式组件: 要使用的技术要点: C++B中的消息处理机制,每个Control都有一个MainWndProc是static 函数,实际调用的是WndProc,这个是是虚函数, 各个组件可以重载wndproc来处理特定消息,缺省是调用Dispose消息函数: 一、重载WndProc函数 void __fastcall......

自学C++,会写HelloWorld 592

C++ Builder 实现托盘图标

在工程文件里面添加红色的代码.能够实现隐藏,但如果要在托盘显示图标,就应该看看下面的其它代码,我没有用TrayIcon控件. 对托盘图标的操作,这里没有给出代码.如果想要一个完整的例子,可以给我来信:lwqcny@163.com WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {   try   {     Application-&gt;Init...

weixin_33892359的博客 353

C++ Builder编写Tray程序

Tray(托盘)是Windows9x任务条上的一个特殊区域,它的技术名称为“任务栏布告区”,一些软件(如金山词霸Ⅲ)运行时会在托盘上放置一个图标,使用户一眼就能知道这个程序正在后台运行,要想激活它也很容易,通常只需单击一下这个图标即可,非常方便。    Tray的编程比较特殊,但并不难,主要包括图标、工具提示和消息等三个方面,它是Shell编程的一部分。ShellAPI提供了Shell—Notif

xinew的专栏 681

C++ Builder中的TServerSocket,TClientSocket来写网络通讯程序 (转)

C++ Builder中的TServerSocket,TClientSocket来写网络通讯程序 (转)[@more@]本文主要介绍如何在C++ Builder中用TServerSocket,TClientSocket来写一个...

cuiji1279的博客 481

从源码构建Ghetto Skype:开发者必备的编译与打包教程

Ghetto Skype是一款基于Electron框架开发的桌面客户端,它通过Web Skype接口实现了与Linux桌面环境的深度整合,提供系统托盘图标和通知功能。本教程将详细介绍如何从源码编译并打包这款实用的Skype客户端,让开发者能够快速掌握构建流程。 ## 📋 准备工作:环境搭建与依赖安装 在开始构建Ghetto Skype之前,需要确保系统满足以下要求并安装必要的依赖包: ##

gitblog_00580的博客 235

Flutter Windows桌面端开发实战指南

跨平台开发框架Flutter通过其独特的渲染架构实现了高性能的UI绘制,其中Skia图形引擎的硬件加速能力是关键所在。在工程实践中,开发者可以利用单一代码库构建适配多端的应用程序,大幅提升开发效率。特别是在Windows桌面端场景下,Flutter通过MethodChannel机制与原生Win32 API深度集成,实现了包括窗口管理、DPI感知、输入法支持等桌面专属功能。对于需要同时覆盖移动端和桌面端的企业级应用,这种技术方案能显著降低维护成本。本文以Windows平台为例,详解如何通过flutter_dp

weixin_33795806的博客 327

Spring Boot+Vue项目桌面化实战:Electron集成与exe打包全流程

桌面应用开发是满足离线使用、系统集成和原生体验需求的重要技术方向。其核心原理在于利用跨平台框架将Web技术栈封装为独立的可执行程序。Electron作为主流框架,通过Chromium渲染引擎和Node.js运行时,实现了使用HTML、CSS和JavaScript开发桌面应用的能力,具有极高的技术价值。在工程实践中,将成熟的Spring Boot后端与Vue前端项目集成到Electron中,能够最大化复用现有代码,快速构建具备本地服务、系统托盘和文件读写功能的桌面软件。本文聚焦于**Spring Boot**

weixin_30340819的博客 363

Electron桌面开发实战:跨平台、高性能与安全优化指南

Electron是一种基于Chromium和Node.js的跨平台桌面应用开发框架,其核心原理是通过主进程与渲染进程的物理隔离实现崩溃防护、安全沙箱与性能解耦。技术价值在于复用Web技术栈(React/Vue/HTML/CSS)、统一调试体验(Chrome DevTools直连)及极简分发流程(三端安装包一键生成)。典型应用场景包括SaaS离线化工具、IoT设备配套软件、企业级本地化应用等。本文深入解析Electron架构设计、IPC通信机制、预加载脚本安全模型,并结合真实项目验证内存优化(320MB稳定占

chuange6363的博客 398

基于Vue3+Electron的桌面宠物应用开发实战

桌面应用开发是前端工程师拓展技术边界的重要方向,其核心在于利用Web技术栈实现跨平台的本地化应用。通过Electron框架,开发者可以调用系统原生API,创建无边框窗口、集成系统托盘,并实现复杂的本地交互逻辑。结合Vue 3的响应式系统与组合式API,能够高效管理应用状态与驱动UI更新,这为构建高性能、可维护的桌面应用提供了坚实的技术基础。本文聚焦于一个具体的工程实践案例——桌面宠物应用,详细拆解了如何利用Vue 3和TypeScript构建宠物状态模型,并集成Electron实现跨平台窗口管理与系统托盘交

weixin_33755649的博客 539

Trae IDE:离线优先的AI原生开发环境深度解析

AI IDE正从语法补全工具演进为具备意图理解与任务闭环能力的智能协作者。其核心原理在于将自然语言指令转化为结构化任务图谱,通过本地化模型调度、代码上下文感知与技能化执行引擎实现端到端自动化。技术价值体现在降低隐性开发成本、保障数据合规性、提升团队知识复用效率。典型应用场景包括离线金融系统开发、嵌入式调试、SOP自动化封装及技术债治理。Trae Solo作为代表,以Rust构建独立进程、支持Claude-3.5-Sonnet等多模型路由、提供可审计的Skills机制,标志着AI IDE进入‘操作系统级协作者

575

Electron桌面开发核心原理:主进程与渲染进程协同机制解析

Electron作为主流跨平台桌面开发框架,其本质是基于Chromium渲染引擎与Node.js运行时的双进程架构。理解主进程(负责系统级能力调度)与渲染进程(专注UI交互)的职责分离,是掌握IPC通信、性能优化与安全加固的前提。该架构通过进程隔离实现UI线程不阻塞,支撑高响应式本地应用开发,广泛应用于SaaS客户端、硬件交互工具及离线优先型生产力软件。本文深入剖析Electron的进程模型、通信范式与工程落地要点,帮助Web开发者高效构建兼具原生体验与迭代速度的桌面应用。

weixin_33851177的博客 378

Electron与Flutter桌面开发深度对比:架构、性能与选型实战指南

在跨平台桌面应用开发领域,选择合适的框架是项目成功的关键。从技术原理层面看,跨平台方案通常通过封装原生能力或自建渲染引擎来实现代码复用。Electron基于Web技术栈,通过整合Chromium和Node.js,允许开发者使用熟悉的HTML、CSS和JavaScript构建应用,其优势在于**开发门槛低**和**生态成熟**,但需面对资源占用较高的挑战。Flutter则采用自绘引擎,通过Skia图形库实现高性能渲染,提供一致的UI体验和更优的资源控制。在**性能优化**实践中,两者各有侧重:Electron

weixin_33805992的博客 521

NW.js深度解析:构建跨平台桌面应用的终极指南

NW.js(前身为node-webkit)是一个基于Chromium和Node.js的应用程序运行时环境,它让开发者能够直接通过DOM和WebWorker调用所有Node.js模块,从而开创了使用Web技术编写原生桌面应用程序的全新方式。本文面向中级和高级开发者,深入探讨NW.js的技术架构、配置优化、性能调优及实际应用中的最佳实践,帮助您充分利用这一强大框架构建高效稳定的跨平台桌面应用。 ##

gitblog_00687的博客 348
上一篇: 用 C++Builder 编写发送电子邮件软件
下一篇: 用 C++Builder 建立自己的 Web 浏览器
iamfancy
博客等级 码龄25年 1粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值