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

问题描述:

这是一个很难描述的问题,我已经搜索了大约一个小时,但无济于事。当“不再需要”时关闭一个窗口

基本上,图象一个小的“弹出”窗口等Windows 7的无线控制或从系统托盘(通知区域)的音量滑块。当你点击图标时,应用程序弹出焦点,如果你点击它,窗口会自行破坏。我认为它很容易通过简单地让我的窗口在它失去焦点时自我销毁它(我一直在听WM_KILLFOCUS),但问题是,如果点击图标,我的窗口并不总是得到焦点。由于情况并非如此,如果用户点击我的图标,然后点击消失,因为这是一个错误(在桌面上说),那么我如何设置我的应用程序关闭?

我已经试过搞乱SPY ++,但检查的音量控制/无线控制应用被证明是困难的,因为它们会消失,当我试图让自己的窗口/进程句柄。

谢谢!

这种实现的通常方法是在窗口创建时启动一个定时器。如果窗口在定时器触发前获得焦点,这意味着用户已与窗口交互。在这种情况下,窗口会停止计时器,并在失去焦点时自行破坏。如果窗口在定时器被触发之前没有得到焦点,窗口将在定时器事件中自行销毁。

这也通常与不透明度动画结合起来,从而使窗口淡出在等待用户。对用户的视觉反馈进行排序,它很快就会消失。但是,不透明度动画主要用于通知吐司,并且很少用于音量控制等控制窗口。

另一种方法是,当用户使用你的系统托盘图标交互来强制设定在窗口中的焦点。

另请注意,如果您的窗口是*窗口,首选收听的消息不是WM_KILLFOCUS,而是WM_ACTIVATEWM_MOUSEACTIVATE。您还可以收听WM_NCACTIVATE,但如果您正在进行自定义非客户端区域,那么该程序有一些具体内容。

更新:您可以通过调用它要么SetActiveWindowSetFocus将焦点设置到你的窗口,当你创建(或当你使其可见,如果你隐藏了它)。

+0

你的计时器的想法会工作,我可以使用它,但它似乎并不是官方Windows工具这样做的方式。他们强制设定焦点,我不积极如何去做。 – 2010-06-14 20:47:42

+0

我使用Activate(),感谢您的建议。 – 2010-06-14 21:59:32

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

+0

如何创建一个弹出,而无需创建一个窗口开始(但有托盘图标),因为如果我这样做的话,我可以模拟一个正常的窗口的行为不管。 – 2010-06-14 20:46:55

很久很久以前,我写了一个下拉更换为Windows 3.1任务管理器通过处理WM_ACTIVATEAPP做到了这一点。试试看。

+0

我的窗口出现时从未激活;我现在意识到这是因为我只是隐藏并显示它而不是重新创建它。我不确定哪种策略更好,因为每次重新创建它都需要隐藏的窗口始终运行,至少就我从WPF中可以看出的那样。 – 2010-06-14 20:45:40