Blog. Just Blog

MessageBox с чекбоксом "Больше не показывать"

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Образ мышления: Assembler | Автор: ManHunter
Еще одна хорошая практика взаимодействия с пользователем - окно сообщения с чекбоксом "Больше не показывать это диалоговое окно". Таким образом и приложение выполняет свою работу по уведомлению пользователя о каком-то периодическом событии, и пользователь сам решает, желает ли он наблюдать это уведомление в дальнейшем. Делается это при помощи стандартной функции SHMessageBoxCheck. По параметрам эта функция очень похожа на вызов MessageBox, но поддерживает ограниченное количество стилей и не весь набор кнопок, а также обязательно требует текстовую строку с уникальным идентификатором этого сообщения. В остальном все сводится к единственному вызову, типа такого:
  1. ; Уникальный идентификатор окна сообщения
  2. szUID   db '{D9108BA3-9A61-4398-BFBC-B02102C77E8A}',0
  3.         ...
  4.         ; Значение по умолчанию
  5.         DEFAULT_RESULT = 0
  6.         ; Вывести окно сообщения с галочкой "Больше не показывать"
  7.         invoke  SHMessageBoxCheck,HWND_DESKTOP,\
  8.                 szMess,szTitle,MB_YESNO+MB_ICONEXCLAMATION,\
  9.                 DEFAULT_RESULT,szUID
  10.         ; EAX = выбранная кнопка или DEFAULT_RESULT
Получившееся окно очень похоже на обычное окно сообщения, только внизу к нему добавляется локализованная строка "Больше не показывать это диалоговое окно". Если пользователь поставит эту галочку и сделает какой-либо выбор, в реестре в ключе HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\DontShowMeThisDialogAgain добавится новый параметр с именем уникального идентификатора, который был использован при создании окна сообщения, и строковым значением "NO". При очередном вызове функции SHMessageBoxCheck с таким же уникальным идентификатором, система проверяет наличие и значение этого параметра. Если параметр в реестре найден, то окно сообщения появляться не будет, а приложению сразу же вернется используемое при вызове дефолтное значение. Кстати, хотя такое окно визуально напоминает окно, создаваемое функцией MessageBox и ее аналогами, по своей структуре оно гораздо сложнее. И если у вас вдруг возникнет желание как-нибудь его кастомизировать, то сделать это будет не так просто. По крайней мере на установку хука WH_CBT оно точно не реагирует.

Чтобы сообщение снова могло отображаться, надо просто удалить соответствующий параметр из реестра или изменить его значение с "NO" на любое другое. Но во втором случае это значение почему-то фиксируется и больше не меняется, сколько бы пользователь ни ставил галочку "Не показывать".

Несмотря на то, что на сайте MSDN для этой функции заявлена поддержка Windows XP, фактически это не так. Для использования SHMessageBoxCheck требуется Windows Vista и выше. Если требуется обратная совместимость, то надо будет проверять доступность этой функции и для более старых операционных систем придется использовать обычный MessageBox.

В приложении пример программы с исходным текстом, которая выводит окно сообщения с чекбоксом "Больше не показывать это диалоговое окно", а также пакетный файл для сброса записи в реестре для этого окна.

Пример программы с исходным текстом (FASM)Пример программы с исходным текстом (FASM)

MessageBox.with.CheckBox.Demo.zip (1,639 bytes)


Поделиться ссылкой ВКонтакте
Просмотров: 1083 | Комментариев: 6

Метки: Assembler, окна
Внимание! Статья опубликована больше года назад, информация могла устареть!

Комментарии

Отзывы посетителей сайта о статье
ManHunter (07.10.2021 в 10:33):
Значит в MSDN в очередной раз ошиблись. Дописал в статью абзац про поддержку.
voffka (07.10.2021 в 09:00):
В sp3 тоже не будет работать. Последняя поддерживаемая хр shlwapi это 6.0.2900, в ней нету SHMessageBoxCheck. Следующая 6.0.6001 уже требует новый kernel32
user (07.10.2021 в 01:53):
На нескольких машинах эта система уже закатана в образы, больше десяти лет назад, - семёрку на них тулить глупо, а возиться с обновлением SP2 до SP3.. Ещё более глупо.
Выбрал просто для себя некие стандартные требования к софту.
И как-то получается, что если софт общего назначения не запускается в XP/SP2, то уже это одно служит показателем  некоторой его говённости.
То есть раз автар не удосужился обеспесить совместимость "вниз", то он не удосужился сделать и ещё многое другое, без чего софт считаться удобным  не может.
Статистика.

Приятно удивляет в этом смысле ТоталКоммандер, последние версии которого нормально работают также и в Win9x. Невольно зауважал. - Это одна из редких программ на Паскале, которая внушает

А вот Hiew в этом смысле изговнился, сейчас требует минимум WinXP.
user (07.10.2021 в 01:29):
Привычка. Ну, и SoftICE тоже, бывает.
ManHunter (07.10.2021 в 00:10):
При всей моей любви к старым системам, позволю себе поворчать. Большинство самой мякотки добавили в SP3. В чем необходимость SP2? SoftICE?
user (07.10.2021 в 00:02):
Использование таких "удобняшек" это самый лёгкий способ получить непортабельное приложение.
Пример из этой статьи у меня на WinXP/SP2 не запустился, система сообщила,
что функция SHMessageBoxCheckA не найдена.
Несмотря на то, что работа в WinXP была заявлена.

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.08 сек. / MySQL: 2 (0.0088 сек.) / Память: 4.5 Mb
Наверх