我想通知用户我的应用程序想要使用标准MessageBox
启动升级过程。有没有办法实现重新实现MessageBox
?
例如,对于标准按钮,您可以发送BCM_SETSHIELD
消息。消息框有类似的东西吗?
答案 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
。