cUI 系列 -- 任务栏托盘
一、应用场景
常规的桌面端后台应用程序:没有通俗意义上的 UI 线程。此时,它需要一个任务栏图标。
二、客户端构成
鉴于系列首篇,额外插入该环节。
- 物理载体:窗口,比如:windows 中的 win32 窗口。
- 逻辑载体:“UI 线程” 和它的消息队列,用于维护或者共享当前的输入状态,比如:键盘状态,焦点窗口。
- 消息循环:用于处理属于 “UI 线程” 的所有消息。
三、问答
鉴于系列首篇,额外插入该环节。
- 什么是 “UI 线程”?
没有所谓的 “UI 线程”,它是所有非系统线程的代名词,也即:任何“用户线程”都可以作为 “UI 线程”。 - 单进程可以拥有两个 “UI 线程”吗?
可以,没有理论上限。 - 消息循环的转发机制?
系统队列 –> 线程队列(Input Desktop) –> 窗口过程。 - 窗口与对话框的区别?
还真有区别,自行 deepseek 吧。对话框(非模态,窗口级模态,进程级模态)算是高度定制的窗口。同时,对话框拥有特定的创建接口,消息类型等。
四、参考代码
基础实现
示例程序使用单独的线程,来维护消息窗口的消息循环。消息窗口的作用,如下所示:
- 托盘图标:指定的父窗口可接收任务栏图标的交互事件。特定事件构成:自定义的托盘消息 & lParam 参数。
- 右键菜单:指定的父窗口可接收右键菜单的交互事件。特定事件构成:WM_COMMAND 消息 & 自定义参数。
示例程序
该示例仅包含通用的 win32 接口和标准 thread 接口调用。此 C# 代码也可以无缝转为 C/C++ (无需 P/Invoke, 更简单).
点我获取示例程序
cUI 系列 -- 任务栏托盘
https://jalencui.com/2025/10/11/cUI-tray/