【问题标题】:Separate taskbar button for dialog用于对话框的单独任务栏按钮
【发布时间】:2023-03-09 05:31:01
【问题描述】:

我支持基于 WinAPI/ATL 的应用程序,其中包含根据用户操作创建的许多对话框窗口。大多数对话框都是无主窗口。如果同时创建多个对话框,它们的任务栏按钮会在任务栏上组合在一起(默认行为)。

现在我的任务是为其中一个对话框窗口创建一个单独的任务栏按钮。我找不到有关如何执行此操作的任何相关信息。我什至尝试使用ITaskbarList COM 接口,但它的AddTab() 方法就像上面的默认模型一样工作。

是否可以在一个应用实例的任务栏上放置多个按钮?如果是,请解释我如何实现这一点。

【问题讨论】:

    标签: c++ windows winapi taskbar


    【解决方案1】:

    在 Windows 7 及更高版本上,您可以为对话框分配不同的Application User Model ID,它不会与任务栏上的其他对话框分组。

    请参阅 Raymond Chen 关于此主题的博客文章:

    How do I customize how my application windows are grouped in the Taskbar?

    另见:

    Developing for the Windows 7 Taskbar — Application ID

    例如:

    int WINAPI wWinMain(HINSTANCE hinst, HINSTANCE hinstPrev,
                       LPWSTR lpCmdLine, int nShowCmd)
    {
        SetCurrentProcessExplicitAppUserModelID(L"MyCompany.MyApp.MainProcess");
    
        ...
    
        HWND hDlg = ...
        IPropertyStore *pps = NULL;
        if (SUCCEEDED(SHGetPropertyStoreForWindow(hDlg, IID_PPV_ARGS(&pps))))
        {
            PROPVARIANT pv;
            PropVariantInit(&pv);
            InitPropVariantFromString(L"MyCompany.MyApp.LoneDialog", &pv);
            pps->SetValue(PKEY_AppUserModel_ID, pv);
            PropVariantClear(&pv);
            pps->Release();
        }
    
        ...
        return 0;
    }
    

    【讨论】:

    • 感谢您的回答,SetCurrentProcessExplicitAppUserModelID() 解决了我的问题 :)
    • 事实上我以前看过这些链接,但希望单进程应用程序存在更简单的方法,因为通过当前的解决方案,我需要在显示目标对话框窗口后恢复以前的 AUMID(对不起我的英语)
    • @Vitaliy 如果您计划让对话框显示其自己的任务栏按钮,然后再重新合并到主组中,则只需恢复以前的 AUMID。请记住,每个窗口都可以有自己的 AUMID,SetCurrentProcessExplicitAppUserModelID 只是设置一个进程范围的默认 AUMID,但每个窗口不限于该 AUMID。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多