【发布时间】:2020-01-20 09:41:41
【问题描述】:
我的应用应始终最小化到系统托盘,而不是任务栏。
为此,我处理WM_SYSCOMMAND/SC_MINIMIZE:
case WM_SYSCOMMAND:
switch (wParam)
{
case SC_MINIMIZE:
minimizeToTray();
return FALSE;
...
但是,这不包括在没有WM_SYSCOMMAND 的情况下窗口最小化的事件。
例如:我可以使用Win+D(显示桌面)最小化窗口。
为了解决这个问题,我处理WM_ACTIVATE/WA_INACTIVE:
case WM_ACTIVATE:
{
if (LOWORD(wParam) == WA_INACTIVE && HIWORD(wParam) != 0)
{
minimizeToTray();
}
...
这似乎只有在窗口在显示桌面之前处于活动状态时才起作用。
问题:
当窗口已经处于非活动状态时,没有WM_ACTIVATE 进来检测最小化。哪条消息告诉我非活动窗口被最小化了?
编辑:WM_WINDOWPOSCHANGED 似乎是检查窗口是否最小化的正确位置,当它不活动时。
此外,当我激活其他一些最大化的应用程序时,完全覆盖我自己的应用程序时,我也想最小化到托盘,但不知道在这种情况下是否有消息要处理。在这种情况下,WM_ACTIVATE 的 wParam 的高位词是 0(如果窗口刚刚停用但仍然可见,也是如此)。
【问题讨论】:
-
嗯,Win+D 没有发送最小化信号似乎是对 MS 部分的疏忽。
-
嗯,是的,那是给你的 MS……不过,我将不得不应付目前的情况。
-
Related: What is the difference between Win + D (Show Desktop) and Win + M (Minimize All) keyboard shortcuts in Windows: "当你按下 Win + M 时,操作系统会向所有窗口发送一条特殊消息 WM_MINIMIZE,它们应该被最小化到任务栏......当按Win+D,操作系统会隐藏不能最小化的窗口"