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

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

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


person riv    schedule 15.03.2014    source источник


Ответы (2)


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

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

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

person david.pfx    schedule 15.03.2014
comment
Спасибо, попробую уловку с окном 1x1. Не уверен, что вы имеете в виду под сообщениями, проходящими через цикл, меня интересует колесико мыши и ввод с клавиатуры, которые, очевидно, не отправляются, если окно не имеет фокуса ... Кроме того, несколько не связанное с этим, есть ли способ предотвратить Панель задач не отображается, когда я щелкаю всплывающее окно (оно отображается в полноэкранной игре, которая обычно закрывает панель задач)? - person riv; 17.03.2014
comment
См. Правки. Фокус в основном относится к клавиатуре, а не к мыши. Самое верхнее окно или полноэкранный DC - это способы скрыть панель задач. - person david.pfx; 18.03.2014

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

person riv    schedule 22.03.2014