2011-03-18 31 views

回答

5

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

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

'MessageBox'被调用后,另一种方式是处理WM_ACTIVATE,'wParam'应该是WA_ACTIVE,'lParam'应该是对话框类的一个窗口句柄。然后,您可以将'BCM_SETSHIELD'消息发送到按钮f.i.控制编号为IDOK

messsage box with shielded button

+0

+1良好的工作,但我觉得我的解决方案是少一点哈克! – 2011-03-18 12:06:56

+0

谢谢,我想这跟我想要的一样接近。我会进一步调查这一点。 – 2011-03-18 12:31:46

+0

@David - 谢谢!不是很多,我猜,#32770是winuser.h中的'WC_DIALOG'。类名是[记录](http://msdn.microsoft.com/en-us/library/ms633574%28v=vs.85%29.aspx#system),即使*完整性*。 :) – 2011-03-18 16:38:23

8

为了获得盾牌图标到系统提供的消息对话框中你将需要处理从对话框回调的按钮。

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

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

+0

这看起来不错,但我仍然瞄准XP。所以没有Vista的API我也许应该添加一个XP标签。 – 2011-03-18 12:27:20

+2

XP没有UAC,所以试图显示屏蔽图标将不起作用。 Sertac的黑客可能会在Windows的未来版本中崩溃。我的建议是投入更多时间来实现一个在XP上调用MessageDialog的包装类,以及在Vista和更高版本上调用TaskDialogIndirect。 – 2011-03-18 12:30:05