Как добавить значок щита UAC в стандартное окно сообщения? - PullRequest
4 голосов
/ 18 марта 2011

Я хочу уведомить пользователя, что мое приложение хочет запустить процесс с повышенными правами, используя стандарт MessageBox.Есть ли способ добиться такого короткого переопределения MessageBox?

Например, для стандартных кнопок вы можете отправить сообщение BCM_SETSHIELD.Есть ли что-то похожее для окон сообщений?

Ответы [ 2 ]

9 голосов
/ 18 марта 2011

Чтобы получить значок щита на кнопках диалогового окна с сообщением системы, вам потребуется обработать обратный вызов из этого диалога.

Например, я проиллюстрирую это с помощью TaskDialogIndirect() API, представленный в Vista.

Основной диалог позволяет указать основной значок, но не значок щита для кнопок в диалоговом окне.Для этого вам необходимо предоставить функцию обратного вызова , которая отвечает на уведомление 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;
}

Магиясодержится в сообщении TDM_SET_BUTTON_ELEVATION_REQUIRED_STATE.

Насколько я могу судить, именно таким образом вы намерены достичь желаемого эффекта.

5 голосов
/ 18 марта 2011

Кнопки в диалоге сообщений являются стандартными кнопками, вы можете отправить им сообщение BCM_SETSHIELD.

Для этого вам необходимо знать, когда диалоговое окно сообщения активировано. Одним из способов может быть установка временного WH_CBT хука и в его обратном вызове отслеживание nCode HCBT_ACTIVATE для окна, имеющего класс диалога (# 32770).

Другим способом может быть обработка WM_ACTIVATE после вызова MessageBox, wParam должно быть WA_ACTIVE, а lParam снова должен быть дескриптором окна диалогового класса. Затем вы можете отправить сообщение «BCM_SETSHIELD» на кнопку f.i. имеющий контрольный идентификатор IDOK.

messsage box with shielded button

...