如何将UAC盾牌图标添加到标准消息框?

时间:2011-03-18 10:31:40

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

我想通知用户我的应用程序想要使用标准MessageBox启动升级过程。有没有办法实现重新实现MessageBox

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

2 个答案:

答案 0 :(得分:9)

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

例如,我将使用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消息中。

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

答案 1 :(得分:5)

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

为此,您需要知道何时激活消息对话框。一种方法是设置临时WH_CBT挂钩,并在其callback中监视HCBT_ACTIVATE的'nCode',以获得具有对话类(#32770)的窗口。

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

messsage box with shielded button