【问题标题】:How do I add the UAC shield icon to the standard messagebox?如何将 UAC 盾牌图标添加到标准消息框?
【发布时间】:2011-07-18 01:38:05
【问题描述】:

我想通知用户我的应用程序想要使用标准 MessageBox 启动提升的进程。除了重新实现MessageBox,有没有办法实现这一点?

例如,对于标准按钮,您可以发送BCM_SETSHIELD 消息。消息框有类似的东西吗?

【问题讨论】:

    标签: windows winapi visual-c++ windows-xp


    【解决方案1】:

    为了将盾牌图标放到系统提供的消息对话框的按钮上,您需要处理来自对话框的回调。

    以Vista中引入的TaskDialogIndirect() API为例进行说明。

    基本对话框允许您指定主图标,但不能指定对话框上按钮的盾牌图标。为此,您需要提供响应 TDN_CREATED 通知的 callback function

    该回调可能如下所示:

    HRESULT CALLBACK TaskDialogCallbackProc(
        HWND hwnd,
        UINT uNotification,
        WPARAM wParam,
        LPARAM lParam,
        LONG_PTR dwRefData
    )
    {
       if (TDN_CREATED == uNotification)
       {
           SendMessage(
               hwnd,
               TDM_SET_BUTTON_ELEVATION_REQUIRED_STATE,
               ID_FOR_MY_BUTTON_SPECIFIED_IN_TASKDIALOGCONFIG_STRUCT,
               1
           );
       }
       return S_OK;
    }
    

    魔法包含在TDM_SET_BUTTON_ELEVATION_REQUIRED_STATE 消息中。

    据我所知,这是你想要达到你想要的效果的方式。

    【讨论】:

    • 这看起来不错,但我仍然以 XP 为目标。所以我没有 vista API... 我应该添加一个 XP 标签。
    • XP 没有 UAC,因此尝试显示盾牌图标将无效。 Sertac 的黑客攻击可能会在未来版本的 Windows 上破解。我的建议是花更多的时间来实现一个包装类,在 XP 上调用 MessageDialog,在 Vista 及更高版本上调用 TaskDialogIndirect。
    【解决方案2】:

    消息对话框中的按钮是标准按钮,您可以向它们发送BCM_SETSHIELD 消息。

    为此,您需要注意消息对话框何时被激活。一种方法是设置一个临时的WH_CBT 钩子,并在其callback 中监视具有对话框类(#32770)的窗口HCBT_ACTIVATE 的“nCode”。

    另一种方法是在调用“MessageBox”后处理WM_ACTIVATE,“wParam”应该是WA_ACTIVE,“lParam”应该是对话框类的窗口句柄。然后您可以将“BCM_SETSHIELD”消息发送到按钮 f.i。具有控制 ID IDOK

    【讨论】:

    • +1 干得好,但我觉得我的解决方案不那么老套!!
    • 谢谢,我想这已经接近我想要的了。我将对此进行进一步调查。
    • @David - 谢谢!.. 我猜不是很多,#32770 在 winuser.h 中是 WC_DIALOG。类名是documented,即使是为了完整性。 :)
    • 我想如果您对消息挂钩感到满意,它就不会那么难了。我不是,但这只是缺乏经验。不过你得到了勾号,所以我必须在这个上给你最好的! ;-)
    猜你喜欢
    • 2011-01-29
    • 1970-01-01
    • 2018-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多