Задать вопрос
Casper-SC
@Casper-SC
Программист (.NET)

Как отловить момент, когда окно помещается в одну из сторон экрана (прилипает как бы), при нажатии WIN + LEFT?

Интересует, как узнать об этом. Потому что, как мне кажется, винда явно как-то даёт себе знать, что окно не просто руками в сторону поместили, а именно оно "прилеплено".

Ну или как программно прилепить так окно не прибегая к симуляции нажатия этой комбинации?

Вообще, я разрабатываю WPF приложение, поэтому такие теги, может в тех разделах кто-то сталкивался.
  • Вопрос задан
  • 517 просмотров
Подписаться 2 Оценить Комментировать
Решения вопроса 2
Nipheris
@Nipheris Куратор тега C++
Я думаю вам придется изучить и частично повторить логику винды в плане приклеивания окна - т.е. получать размер рабочей области на текущем мониторе и делать окно в половину области с нужным положением. С точки зрения приложения нет никакой необходимости сообщать ему, что окно прилеплено - для него не должно быть разницы, прилепили его или вручную поресайзили до такого размера.
Старый размер окна запоминает виндовый менеджер окон, как и в случае c maximize/minimize - иначе бы старые приложения не работали с прилипанием, а они все работают без проблем, значит операционка ничего нового не требует.
Ответ написан
Casper-SC
@Casper-SC Автор вопроса
Программист (.NET)
Вот решение проблемы с максимизацией окна
blogs.msdn.com/b/llobo/archive/2006/08/01/maximizi...

Но в конкретно этом примере есть проблема, там сбрасывается минимальный размер окна. Его тоже нужно задавать.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
zenden2k
@zenden2k
PHP & C++ programmer
>Интересует, как узнать об этом.
К сожалению, Windows не посылает специального сообщения при этом. Можно обрабатывать сообщение WM_SIZE и при этом ранее не было получено сообщение WM_SYSCOMMAND.

>Ну или как программно прилепить

Костыльный способ:
RECT rc, originalRect;
SystemParametersInfo(SPI_GETWORKAREA, 0, &rc, 0);
GetWindowRect(hwnd, &originalRect);
SetWindowPos(hwnd, 0, rc.left, rc.top, (rc.right - rc.left) / 2, originalRect.bottom - originalRect.top, 0);
PostMessage(hwnd, WM_NCLBUTTONDBLCLK, HTTOP, 0);

Не знаю, как это сделать, не изменяя ширины окна. Не тестировался на мультимониторных конфигурациях.
Правда по сути эмуляция нажатия клавиш будет лучше работать.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы