EDIT: Как оказалось, это не сработает. По крайней мере, ловушка сообщения не будет работать, потому что сообщение отправлено, а не отправлено, а насчет ловушки CBT я тоже не уверен, и в настоящий момент я не могу ее протестировать, чтобы дать обоснованное заявление. Решение, вероятно, состоит в том, чтобы создать подкласс окна, но это тоже нетривиально, и я не могу объяснить это правильно и с рабочими примерами прямо сейчас. Я не могу удалить этот ответ, потому что в нем уже есть комментарий. См. здесь для получения дополнительной информации. Так что относитесь к этому с недоверием. Я передаю ответ в вики сообщества, не стесняйтесь редактировать его и исправлять / улучшать решение!
EDIT2: Кажется, даже подкласса будет недостаточно потому что Word делает все по-своему.
Вам понадобится windows крючок . Подойдет либо ловушка CBT, либо ловушка getmessage.
Вы должны создать DLL, чтобы это работало. Обработчик ловушки должен находиться в DLL. Он должен иметь ту же разрядность, что и Word (возможно, 64-разрядный). Затем вы вызываете SetWindowsHookEx
, чтобы установить глобальную ловушку.
В ловушке вам нужно будет проверить, является ли текущее действие попыткой закрытия окна (в ловушке CBT вы должны проверить наличие HCBT_SYSCOMMAND
из SC_CLOSE
, в ловушке getmessage вы должны проверить наличие сообщения WM_CLOSE
), и касается ли оно окна Word (например, с использованием класса окна - не уверен, есть ли у него узнаваемый класс, вам придется check - или имя исполняемого файла процесса, которое вы можете получить, используя GetModuleFileName
, поскольку вы будете работать внутри процесса Word) и предотвратите действие (вернув 1 из ловушки CBT или вернув 0 из ловушки getmessage - на allow , звоните CallNextHookEx
).