You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建行为类似任务栏(shell_traywnd)的窗口?

实现类任务栏停靠窗口的解决方案

你想要实现的挤占系统工作区、让其他应用窗口自动避让的窗口,本质是Windows系统提供的应用程序桌面工具栏(AppBar),仅修改窗口样式属性无法实现该效果,需要调用Shell提供的SHAppBarMessageAPI完成注册配置。

核心实现步骤

  • 第一步:创建基础窗口,建议调整窗口样式避免冗余属性:不要同时使用互斥的WS_OVERLAPPEDWINDOW和WS_POPUP,如果需要简单边框可选择WS_POPUP | WS_BORDER | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN,扩展样式保留WS_EX_TOPMOST即可。
  • 第二步:调用SHAppBarMessageAPI向系统注册当前窗口为AppBar,配置停靠位置和尺寸,系统会自动调整全局工作区范围,所有普通窗口最大化时会自动避让你的窗口。
  • 第三步:窗口销毁时调用API注销AppBar,恢复系统工作区默认设置。

核心代码示例

需要引入头文件shellapi.h,并链接shell32.lib库:

// 窗口创建完成后执行注册逻辑
APPBARDATA abd = {0};
abd.cbSize = sizeof(APPBARDATA);
abd.hWnd = hwnd; // 你创建的窗口句柄

// 向系统注册AppBar
SHAppBarMessage(ABM_NEW, &abd);

// 配置停靠在屏幕顶部,宽为屏幕宽度,高50px
abd.uEdge = ABE_TOP;
abd.rc.left = 0;
abd.rc.top = 0;
abd.rc.right = GetSystemMetrics(SM_CXSCREEN);
abd.rc.bottom = 50;

// 先查询系统允许的摆放位置
SHAppBarMessage(ABM_QUERYPOS, &abd);
// 提交最终位置给系统生效
SHAppBarMessage(ABM_SETPOS, &abd);

// 窗口销毁时执行注销逻辑
// SHAppBarMessage(ABM_REMOVE, &abd);

注意事项

  • 如果需要动态调整窗口高度,重新执行ABM_QUERYPOS和ABM_SETPOS的配置流程即可生效。
  • 不要使用对话框类#32770作为窗口类,建议自行注册普通窗口类避免不必要的默认消息处理逻辑冲突。

内容的提问来源于stack exchange,提问作者bko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 22:27:03