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

Yng*_*and 4 windows winapi windows-xp visual-c++

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

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

Dav*_*nan 9

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

例如,我将用TaskDialogIndirect()Vista中介绍的API进行说明.

基本对话框允许您指定主图标,但不能指定对话框上按钮的屏蔽图标.为此,您需要提供响应通知的回调函数TDN_CREATED.

回调可能如下所示:

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;
}
Run Code Online (Sandbox Code Playgroud)

魔术包含在TDM_SET_BUTTON_ELEVATION_REQUIRED_STATE消息中.

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

  • XP没有UAC,因此尝试显示盾牌图标将无效.Sertac的黑客攻击可能会破坏未来的Windows版本.我的建议是投入更多的时间来实现一个在XP上调用MessageDialog的包装类,以及在Vista及更高版本上调用TaskDialogIndirect. (2认同)

Ser*_*yuz 5

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

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

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

带有屏蔽按钮的消息框