2010-06-14 2 views
0

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

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

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

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

Спасибо!

ответ

2

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

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

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

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

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

+0

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

+0

Я использовал Активировать(), спасибо за совет. –

0

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

+0

Как создать всплывающее окно, не создавая окна для начала (пока у вас есть значок в трее), поскольку, если я могу это сделать, то я могу эмулировать поведение с нормальным окном независимо от того. –

1

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

+0

Мое окно никогда не активировалось, когда оно появилось; Я понимаю, что это потому, что я просто прятался и показывал его, а не воссоздавал его. Я не уверен, какая стратегия лучше, так как воссоздание ее каждый раз требует, чтобы скрытое окно всегда работало, по крайней мере, насколько я могу судить по WPF. –

 Смежные вопросы

  • Нет связанных вопросов^_^