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/
Author
Jalen Cui
Posted on
October 11, 2025
Licensed under