Закрытие окна, когда оно «больше не нужно» - PullRequest
0 голосов
/ 15 июня 2010

Это довольно сложный вопрос для описания, и я искал около часа сейчас безрезультатно.

По сути, представьте себе маленькое «всплывающее» окно, например Windows 7 Wireless Control илиVolume Slider из системного трея (область уведомлений).Когда вы нажимаете на значок, приложение всплывает с фокусом, и если вы щелкаете по нему, окно разрушается.

Я думал, что это будет легко решить, просто заставив мое окно уничтожить его самостоятельно, когда онотеряет фокус (я слушал WM_KILLFOCUS), но проблема в том, что если щелкнуть значок, мое окно не всегда получает фокус.Так как это не так, если пользователь щелкает мою иконку, а затем щелкает прочь, потому что это была ошибка (скажем, на рабочем столе), то как я могу настроить закрытие моего приложения?

У меня естьпробовал возиться с SPY ++, но проверка приложений управления громкостью / беспроводного управления оказывается сложной, поскольку они исчезают, когда я пытаюсь получить их дескрипторы окна / процесса.

Спасибо!

Ответы [ 3 ]

2 голосов
/ 15 июня 2010

Обычный способ реализовать это - запустить таймер при создании окна. Если окно получает фокус до срабатывания таймера, это означает, что пользователь взаимодействовал с окном. В этом случае окно просто остановит таймер и уничтожит себя, когда потеряет фокус. В случае, если окно не получило фокус до запуска таймера, окно уничтожит себя при событии таймера.

Это также обычно сочетается с анимацией непрозрачности, так что окно исчезает во время ожидания пользователя. Что-то вроде визуальной обратной связи с пользователем, что это скоро исчезнет. Однако анимация непрозрачности используется в основном для уведомлений, и редко используется для окон управления, таких как регулятор громкости.

Альтернативой является принудительная установка фокуса в вашем окне, когда пользователь взаимодействует с вашим значком в системном окне.

Также обратите внимание, что если ваше окно является окном верхнего уровня, предпочтительным сообщением для прослушивания является не WM_KILLFOCUS, а WM_ACTIVATE и WM_MOUSEACTIVATE. Вы также можете слушать WM_NCACTIVATE, но у этого есть некоторые особенности, если вы делаете пользовательскую не-клиентскую область.

Обновление : вы можете установить фокус на ваше окно, вызвав либо SetActiveWindow, либо SetFocus при его создании (или когда Вы делаете это видимым, если вы это скрываете).

1 голос
/ 15 июня 2010

Давным-давно я написал замену для диспетчера задач Windows 3.1, которая выполнила это, обработав WM_ACTIVATEAPP. Дайте этому попытку.

0 голосов
/ 15 июня 2010

Вы смотрели в Popup?Он исчезнет, ​​как только вы щелкнете за его пределами (если вы не установили для StaysOpen значение true).

...