Как отключить, а затем включить кнопку «Повторить» в MessageBox? - PullRequest
0 голосов
/ 07 октября 2008

У меня есть следующий неуправляемый код C ++:

MessageBox( NULL, strMessage, "Cool Product", MB_RETRYCANCEL | MB_ICONEXCLAMATION);

Я хочу отключить кнопку RETRY на 10 секунд (например), затем включить ее.

Как я могу это сделать?

Ответы [ 6 ]

1 голос
/ 07 октября 2008

Вы не можете напрямую манипулировать элементами управления MessageBox, но вы можете использовать хак. Установите хук WH _ CBT непосредственно перед отображением диалогового окна и обработайте событие HCBT _ ACTIVATE. Это даст вам HWND окна сообщения, так что вы можете делать с ним все, что захотите (создать подкласс, управлять его кнопками и установить таймер).

Вы можете найти Custom MessageBox с демонстрационным кодом на сайте Джеймса Брауна.

1 голос
/ 07 октября 2008

Как говорит @ ffpf , вам нужно создать собственный диалог, используя MFC, ATL, raw Win32 и т. Д.

Затем создайте таймер, который будет включать и отключать кнопку.

0 голосов
/ 07 октября 2008

Я согласен с efotinis, это не невозможно, если у вас есть HWND, вы можете делать с ним все, что хотите. Это просто вопрос "вам действительно нужны хаки или вам лучше просто создать свой собственный диалог с окном сообщений"?

Другой не очень хороший способ найти HWND (который, очевидно, даст вам доступ ко всему в окне сообщения) - это запустить поток и циклически опросить дескриптор окна сообщения, используя EnumChildWindows. Но я лично предпочел бы также хук WH_CBT.

0 голосов
/ 07 октября 2008

Начиная с Vista, вы можете использовать taskdialog - более сложный диалог, чем простое окно сообщения. Больше информации и ссылок здесь .

0 голосов
/ 07 октября 2008

Я не верю, что это возможно при вызове стандартного окна сообщения.

Возможно, вам лучше написать свое собственное окно сообщения, содержащее эту функцию.

(Или вы могли бы написать отдельный поток, который непрерывно наблюдает за экраном, ожидающим появления этого окна сообщения, отключить кнопку повтора, подождать 10 секунд и снова включить ее. Не весело. Серьезно, сделайте это иначе.)

0 голосов
/ 07 октября 2008

При стандартном вызове MessageBox вы не можете. Для этого вам нужно реализовать собственный MessageBox.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...