Как отключить, а затем включить кнопку «Повторить попытку» в MessageBox?

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

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

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
1 174
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

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

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

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

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

Ответ принят как подходящий

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

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

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

И даже без Vista диалоговое окно задачи - гораздо лучший подход, чем окно сообщения. Есть некоторые реализации, которые работают в системах до Vista, и их не так уж сложно реализовать, если вам не нужны все функции сразу.

OregonGhost 07.10.2008 00:47

Не похоже, что вы действительно можете включать и отключать кнопки, только (потенциально) добавлять и удалять.

crashmstr 07.10.2008 00:53

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

Вы можете найти учебник Пользовательское окно сообщений с демонстрационным кодом на сайте Джеймса Брауна.

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

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

Другие вопросы по теме