0

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

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

我认为这很容易解决,只需让我的窗口在失去焦点时自行销毁它(我一直在听 WM_KILLFOCUS),但问题是,如果单击图标,我的窗口并不总是获得焦点。由于情况并非如此,如果用户点击我的图标,然后因为这是一个错误而点击离开(在桌面上说),那么我该如何设置我的应用程序关闭?

我尝试过使用 SPY++,但检查音量控制/无线控制应用程序证明很困难,因为当我尝试获取它们的窗口/进程句柄时它们会消失。

谢谢!

4

3 回答 3

2

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

这通常也与不透明动画结合使用,以便窗口在等待用户时淡出。给用户一种视觉反馈,它很快就会消失。但是,不透明动画主要用于通知 toast,很少用于音量控制等控制窗口。

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

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

更新:您可以通过在创建窗口时调用SetActiveWindow或调用SetFocus它来将焦点设置为窗口(或者当您使其可见时,如果您隐藏它)。

于 2010-06-14T20:19:37.073 回答
1

很久很久以前,我为 Windows 3.1 任务管理器编写了一个替代品,它通过处理WM_ACTIVATEAPP. 试试看。

于 2010-06-14T20:30:54.847 回答
0

你看过弹出窗口吗?一旦你在它外面单击,那个就会消失(除非你将 StaysOpen 设置为 true)。

于 2010-06-14T20:17:12.257 回答