如何创建行为类似任务栏(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
相关产品推荐
相关产品推荐

