当“不再需要”时关闭窗口

时间:2010-06-14 20:09:05

标签: wpf winapi system-tray volume flyout

这是一个难以描述的问题,我现在搜索了大约一个小时但无济于事。

基本上,从系统托盘(通知区域)中拍摄一个小的“弹出窗口”窗口,如Windows 7无线控制或音量滑块。当您单击图标时,应用程序会弹出焦点,如果您单击它,则窗口会自行销毁。

我认为通过简单地让我的窗口在失去焦点时自我毁灭它就可以轻松解决(我一直在听WM_KILLFOCUS),但问题是,如果点击图标,我的窗口并不总是得到焦点。由于情况并非如此,如果用户点击我的图标,然后点击,因为它是一个错误(在桌面上说),那么我该如何设置我的应用程序关闭?

我已经尝试过搞乱SPY ++,但是当我试图获取他们的窗口/进程句柄时,检查音量控制/无线控制应用程序是很困难的,因为它们消失了。

谢谢!

3 个答案:

答案 0 :(得分:2)

通常的方法是在窗口创建时启动计时器。如果窗口在计时器触发之前获得焦点,则表示用户已与窗口进行交互。在这种情况下,窗口将停止计时器,并在失去焦点时自行销毁。如果在触发计时器之前窗口没有获得焦点,则窗口将在计时器事件中自行销毁。

这通常也会与不透明度动画结合使用,以便在等待用户时窗口渐渐淡出。向用户提供即将消失的视觉反馈。但是,不透明度动画主要用于通知转发,很少用于控制窗口,如音量控制。

另一种方法是在用户与系统托盘图标交互时强制在窗口中设置焦点。

另请注意,如果您的窗口是顶级窗口,则首选的收听消息不是WM_KILLFOCUS,而是WM_ACTIVATEWM_MOUSEACTIVATE。您也可以收听WM_NCACTIVATE,但如果您正在进行自定义非客户区域,则会有一些细节。

更新:您可以在创建窗口时通过调用SetActiveWindowSetFocus来设置焦点(或者当您将焦点设为可见时, “隐藏它。”

答案 1 :(得分:1)

很久很久以前,我为Windows 3.1任务管理器编写了一个替代品,通过处理WM_ACTIVATEAPP来实现这一目标。试一试。

答案 2 :(得分:0)

你看过Popup吗?一旦你在它外面点击它就会消失(除非你将StaysOpen设置为true)。