Всплывающее окно не может получить фокус, когда окно верхнего уровня свернуто

Я создаю всплывающее окно (WS_POPUP, WS_EX_TOPMOST, WS_EX_TOOLWINDOW) который может получить фокус при нажатии (вызывая SetFocus в WM_LBUTTONDOWN обработчик). Все работает хорошо, пока я не сверну главное окно приложения (всплывающее окно все еще видно) — теперь, когда я нажимаю на всплывающее окно, оно немедленно снова теряет фокус. Почему это происходит, разве всплывающее окно не должно быть совершенно не связано с главным окном, поскольку оно не дочернее или что-то еще?

Обновление: похоже, это связано с WS_POPUP, Попытка щелкнуть окно, когда главное окно программы свернуто, мигает на панели задач и немедленно убивает фокус.

2

Решение

Цель нажатия на окно — активировать приложение. Если окно является видимым, но не принадлежит (как в вашем случае), то Windows не может активировать приложение при щелчке окна. Это (ожидаемое) поведение, которое вы видите.

Если есть что-то конкретное, чего вы хотите достичь, вы все равно должны видеть сообщения для этого окна, проходящие через цикл сообщений. Сообщения с клавиатуры отправляются только в окно с фокусом. Сообщения мыши отправляются в окно, которое захватило мышь (если оно есть), или в самое верхнее окно под указателем мыши (которое обнаруживается при тестировании нажатия), независимо от того, имеет ли оно фокус или нет. различные другие сообщения могут быть отправлены в окно, если возникнет такая необходимость (например, нарисовать).

Если вы хотите, чтобы ваше всплывающее окно сфокусировалось, то оно должен иметь родительское окно верхнего уровня, которое можно активировать. Обычное решение — создать невидимое окно верхнего уровня (1 пиксель или вне экрана), которое будет его родителем.

1

Другие решения

Нашел интересное решение, которое решает и мою другую проблему (если всплывающее окно отображается над полноэкранной игрой, щелкнув по нему, появится панель задач) — я сделал окно прозрачным (WS_EX_TRANSPARENT) и обрабатывал мышь и клавиатуру через общесистемные зацепки. Единственный недостаток заключается в том, что я должен пропустить движение мыши, потому что его блокировка может привести к остановке курсора (и из-за этого я не могу изменить курсор, так как приложение позади моего всплывающего окна просто вернет его обратно).

0

По вопросам рекламы [email protected]