【问题标题】:How could I detect when my application is minimized?如何检测我的应用程序何时最小化?
【发布时间】:2011-02-11 06:23:19
【问题描述】:

我有一个程序可以选择最小化到任务栏的通知区域。为了让它工作,我需要一种可靠的方法来检测用户何时最小化了应用程序。

如何在 C++ 应用程序中使用 Windows API 做到这一点?

【问题讨论】:

  • 我想问一下 WM_Destroy 是否用于退出,最小化是什么?
  • 你想让你的程序在用户点击最小化按钮时最小化到通知区域吗?
  • 是的,这是我想用 C++ 了解的内容
  • 我看到你recently asked a related question 关于最小化通知区域的应用程序。万一您还在为此苦苦挣扎,您可能会发现this article 很有用。它看起来像是您想要的完整实现。

标签: c++ windows winapi minimize notification-area


【解决方案1】:

当用户最小化窗口时(使用标题栏上的框,或通过从系统菜单中选择“最小化”选项),您的应用程序将收到WM_SYSCOMMAND message。该消息的wParam 参数将包含值SC_MINIMIZE,它指示正在请求的特定类型的系统命令。在这种情况下,您不必关心lParam

因此您需要设置一个消息映射来侦听WM_SYSCOMMAND 消息,并将wParam 设置为SC_MINIMIZE。收到这样的消息后,您应该执行代码,将您的应用程序最小化到任务栏通知区域,并返回 0(表示您已经处理了该消息)。

我不确定您使用的是什么 GUI 框架。对于不同的工具包,示例代码可能看起来非常不同。以下是您可以在直接 Win32 C 应用程序中使用的内容:

switch (message)
{
case WM_SYSCOMMAND:
    if ((wParam & 0xFFF0) == SC_MINIMIZE)
    {
        // shrink the application to the notification area
        // ...

        return 0;
    }
    break;
}

【讨论】:

  • 我使用的软件是Visual Studio 2010。
【解决方案2】:

我认为您正在寻找 WM_SIZE。当你得到这个时,检查 wParam 以获取细节。这是 MSDN 页面。

WM_SIZE

【讨论】:

  • 错了。您不想监听WM_SIZE 来检测应用程序何时被最小化。
  • 出于好奇,是两者兼得还是 WM_SYSCOMMAND 只是首选方式?
  • 是的,你会得到它。尽管您的答案在那里有些不完整。您实际上正在寻找等于SIZE_MINIMIZEDwParam。但是处理WM_SIZE 的主要问题是您不能覆盖默认实现。直到窗口最小化之后才会发送消息。
【解决方案3】:

您可以检查从 GetClientRect 返回的区域大小 - 如果为零,则最小化,对我有用,但可能不适用于所有情况。

【讨论】:

    【解决方案4】:

    这就是IsIconic 应该确定的,但它对我来说并不能始终如一地工作。 (哦,为了确定这一点的一致方法......)

    【讨论】:

      【解决方案5】:

      为了完整起见,还有GetWindowPlacement。窗口状态显示在WINDOWPLACEMENT 结构的showCmd 成员中,如果窗口被最小化,它的值为2,或SW_SHOWMINIMIZED

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-01-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-27
        相关资源
        最近更新 更多