Как использовать WinAPI, предотвратить / отменить закрытие окна? - PullRequest
0 голосов
/ 12 июля 2020

Я хочу запретить пользователям закрывать окно с помощью Alt + F4 или нажатием кнопки закрытия.

Как этого добиться?

Я думаю, что windows API может это сделать , но у меня нет опыта, и я не могу найти конкретное решение c.

Конечно, хорошо иметь возможность реализовать его, не нужно использовать специфику c API.

Предыстория: очень сложно найти последнее место в Word после его закрытия на несколько дней. После word2013 слово2013 принесло с собой способ вернуться к предыдущей позиции чтения, но эта вещь очень нестабильна и часто не может быть сохранена. Когда word закрывается, я хочу прекратить закрытие и всплывающее уведомление, напоминающее мне добавить закладку перед выходом.

1 Ответ

1 голос
/ 12 июля 2020

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).

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