Написал обертку (
https://github.com/da-baranov/scide) для популярного в определенных кругах Sciter (
http://terrainformatica.com/sciter).
Sciter предоставляет наружу Plain C API и работает просто: внедряет свой обработчик сообщений в оконную процедуру окна-контейнера, обрабатывает те сообщения, которые ему нужны и не обрабатывает те, которые не нужны.
Обнаружилась вот какая VCL-специфическая проблема.
Если Sciter помещен на форму как WS_CHILD и отображает модальный диалог (аналог window.alert в JavaScript), то закрыть этот диалог мышью нельзя.
Причина этого по-видимому вот в чем:
а) модальный диалог из Sciter рекурсивно вызывает EnableWindow(False) всем родительским окнам вплоть до главной формы
б) при этом срабатывает обратный механизм VCL, который ловит WM_ENABLE или аналогичное внутреннее сообщение Delphi и проделывает то же самое, только в другую строну - рекурсивно дизаблит дочерние окна главной формы, в том числе и тот контрол, который хостит в себе оконную процедуру Sciter
в) тот в свою очередь делает disabled модальному диалогу.
Получается как бы такое самоубийство.
Не понимаю, как эту ситуацию грамотно отработать. Задача вырисовывается такая: окно, которое хостит Sciter, должно, как и задумывал автор Sciter, задизаблиться, но при этом окно модального диалога должно остаться Enabled и реагировать на мышь
Что пробовал:
1) ApplicationEvents - его использование само по себе не очень красиво, ну и собственно после того, как модальный диалог вешает главную форму, в очередь приложения перестают поступать вообще все сообщения, кроме WM_PAINT и WM_ERASEBKGND.
2) WM_ENABLE и CM_ENABLEDCHANGED в наследнике TWinControl, который хостит Sciter, не ловятся вообще, ни в WndProc, ни отдельными процедурами-обработчиками этих сообщений
3) В MFC аналогичный пример работает нормально, модальный диалог сам себя не убивает.
Демо и доступно здесь -
https://github.com/da-baranov/SciDe/releases/download/v3.2.0.4-beta.3/scide-v3.2.0.4-beta.3.zip, см. последний пример - Popups from child windows issue.