【问题标题】:Show taskbar button when using WS_EX_TOOLWINDOW使用 WS_EX_TOOLWINDOW 时显示任务栏按钮
【发布时间】:2021-12-18 01:53:35
【问题描述】:

CreateWindowEx中使用WS_EX_TOOLWINDOW标志时是否可以显示任务栏按钮?

【问题讨论】:

    标签: winapi createwindowex


    【解决方案1】:

    无主的顶级窗口需要WS_EX_APPWINDOW 样式才能在任务栏上显示自身。

    Extended Window Styles 文档明确指出“工具窗口不会出现在任务栏中”。

    MSDN 进一步详细记录了这一点:

    The Taskbar

    每当应用程序创建无主窗口时,Shell 就会在任务栏上放置一个按钮,即没有父窗口并且具有适当的扩展样式位的窗口(请参阅Managing Taskbar Buttons , 下面)。

    ...

    管理任务栏按钮

    每当应用程序创建一个不属于自己的窗口时,Shell 就会在任务栏上创建一个按钮。 为确保窗口按钮放置在任务栏上,请使用WS_EX_APPWINDOW 扩展样式创建一个无主窗口。要防止窗口按钮放置在任务栏上,请使用WS_EX_TOOLWINDOW 扩展样式创建无主窗口。作为替代方案,您可以创建一个隐藏窗口,并让这个隐藏窗口成为您可见窗口的所有者。

    仅当窗口的样式支持可见的任务栏按钮时,Shell 才会从任务栏中删除窗口的按钮。如果您想动态地将窗口样式更改为不支持可见任务栏按钮的样式,则必须先隐藏该窗口(通过调用ShowWindowSW_HIDE),更改窗口样式,然后再显示该窗口。

    ...

    修改任务栏的内容

    Shell32.dll 的Version 4.71 and later 增加了修改任务栏内容的能力。 您现在可以从应用程序中添加、删除和激活任务栏按钮。激活项目不会激活窗口;它在任务栏上显示该项目。

    任务栏修改功能在组件对象模型 (COM) 对象 (CLSID_TaskbarList) 中实现,该对象公开 ITaskbarList 接口 (IID_ITaskbarList)。您必须调用ITaskbarList::HrInit 方法来初始化对象。然后就可以使用ITaskbarList接口的方法来修改任务栏的内容了。

    因此,您也许可以将ITaskbarList::AddTab() 用于您的工具窗口:

    任何类型的窗口都可以添加到任务栏,但建议窗口至少具有WS_CAPTION 样式。

    【讨论】:

    • 好的,那么有没有办法使用 WS_EX_TOOLWINDOW 样式但使用 WS_EX_APPWINDOW 来显示按钮?
    • @Dementor 这两种风格不能混用。但是,您可以尝试使用ITaskbarList::AddTab()。我更新了我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-26
    • 1970-01-01
    相关资源
    最近更新 更多