【发布时间】:2011-07-18 01:38:05
【问题描述】:
我想通知用户我的应用程序想要使用标准 MessageBox 启动提升的进程。除了重新实现MessageBox,有没有办法实现这一点?
例如,对于标准按钮,您可以发送BCM_SETSHIELD 消息。消息框有类似的东西吗?
【问题讨论】:
标签: windows winapi visual-c++ windows-xp
我想通知用户我的应用程序想要使用标准 MessageBox 启动提升的进程。除了重新实现MessageBox,有没有办法实现这一点?
例如,对于标准按钮,您可以发送BCM_SETSHIELD 消息。消息框有类似的东西吗?
【问题讨论】:
标签: windows winapi visual-c++ windows-xp
为了将盾牌图标放到系统提供的消息对话框的按钮上,您需要处理来自对话框的回调。
以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 消息中。
据我所知,这是你想要达到你想要的效果的方式。
【讨论】:
消息对话框中的按钮是标准按钮,您可以向它们发送BCM_SETSHIELD 消息。
为此,您需要注意消息对话框何时被激活。一种方法是设置一个临时的WH_CBT 钩子,并在其callback 中监视具有对话框类(#32770)的窗口HCBT_ACTIVATE 的“nCode”。
另一种方法是在调用“MessageBox”后处理WM_ACTIVATE,“wParam”应该是WA_ACTIVE,“lParam”应该是对话框类的窗口句柄。然后您可以将“BCM_SETSHIELD”消息发送到按钮 f.i。具有控制 ID IDOK。
【讨论】:
WC_DIALOG。类名是documented,即使是为了完整性。 :)