Страницы

Поиск по вопросам

среда, 10 июля 2019 г.

Копирование части окна в буфер

Есть форма WPF. У формы в качестве украшалки вокруг окна тень. Тень прописана своя используя DropShadowEffect. WindowsStyle и прочее установлено в none, соответвенно, так как она является частью окна, то про нажатии Alt+PrintScreen окно копируется вместе с тенью, и соответвенно с тем, что под ней. Как можно реализовать перехват нажатия данной комбинации и копировать в буфер определенный участок окна? Например с отступом со всех сторон по 15 пикселей? UPD: в данном случае предположу что можно не блокировать комбинацию Alt+PrintScreen а получить скриншот окна в обычном событии Нажатия клавиш в фокусе окна, и об аботая его поместить в буфер урезанную версию.


Ответ

Подписка на сочетание клавиш, полагаю, делается так же, как и всегда — с помощью функции RegisterHotKey (правда не гарантирую, что система позволит перекрыть системное сочетание клавиш). В .NET встроенной обёртки нет.
Создание скриншота — традиционный GetDC(0). В .NET обёрнуто в Graphics.CopyFromScreen
За тень окон отвечает система, поэтому вам придётся брать скриншот части экрана, которое занимает окно, плюс запас под тень. Кажется, размеры тени прошиты где-то в поторохах Aero, поэтому размер придётся угадывать на глаз. Так как WPF использует всякие умные масштабирования, то на габариты окна полагаться нельзя, поэтому советую брать габариты напрямую из WinAPI, иначе при масштабе, отличном от 100%, всё сползёт.
Правда, учитывая, сколько это мороки, я бы для начала задался вопросом: а настолько ли оно надо? Гораздо проще положить под окно белый фон, сделать скриншот всего экрана, а потом вырезать нужное. Плюс есть зоопарк программ, которые сделают это удобно и приятно.

Комментариев нет:

Отправить комментарий