【问题标题】:How do I detect minimization in an inactive Win32 app?如何检测非活动 Win32 应用程序中的最小化?
【发布时间】: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_ACTIVATEwParam 的高位词是 0(如果窗口刚刚停用但仍然可见,也是如此)。

【问题讨论】:

标签: c++ windows winapi mfc


【解决方案1】:

调用 IsIconic(hWnd) 以获取当前状态。

【讨论】:

  • IsIconic(hwnd) 产生与 WM_ACTIVATE 相同的高字。当我在我的应用程序上最大化另一个应用程序时,IsIconic(<my hwnd>) 将产生false。此外:在哪里我应该打电话给IsIconic?我明确声明当窗口已经不活动时没有WM_ACTIVATE
  • 与此评论线程相关:WM_WINDOWPOSCHANGED 似乎是这个地方。编辑了问题以包含此内容。
  • WM_WINDOWPOSCHANGED 是获取更改通知的事件。 IsIconic() 是请求当前状态。
猜你喜欢
  • 1970-01-01
  • 2017-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多