【问题标题】:Hide the custom applicaion window but it should show the application icon on the taskbar(not as a tray icon)隐藏自定义应用程序窗口,但它应该在任务栏上显示应用程序图标(而不是托盘图标)
【发布时间】:2017-03-15 06:20:14
【问题描述】:

我需要创建一个示例 Windows 应用程序,其中应用程序应该被隐藏,但应用程序图标应该在任务栏上(而不是托盘图标) 这该怎么做?或者可以这样做吗? 当我使用 ShowWindow(hWnd, SW_HIDE) 时,应用程序被隐藏但在任务栏上看不到。所以我不能用这个。我不想将它添加到托盘图标。 请帮我这样做

【问题讨论】:

  • 听起来你想最小化它。
  • 不,我不想最小化。实际上它是一种最小化,但是当您单击任务栏菜单时,应用程序不应该打开。
  • 好吧,你能处理 OnSysCommand 吗?如果它被设置为 restore 只是抑制调用?我认为代码默认情况下就在那里。不知道你为什么要这样做。
  • 这完全没有意义。您想要任务栏上的按钮,后面没有窗口吗?你讨厌你的用户吗?你喜欢混淆它们吗?
  • 但这就是系统托盘的用途。

标签: c++ windows winapi mfc win32gui


【解决方案1】:

当我使用 ShowWindow(hWnd, SW_HIDE) 时,应用程序被隐藏但在任务栏上看不到。所以我不能用这个。

当您隐藏/显示一个窗口时,它也会相应地隐藏/显示其任务栏按钮。任务栏上的窗口控制其任务栏按钮的可见性以匹配其自身的可见性。没有办法阻止这种行为。

要按照您的要求进行操作,您需要:

  1. 使用SW_MINIMIZE 而不是SW_HIDE,然后让您的窗口丢弃任何WM_SYSCOMMAND 接收到的将其wParam 设置为SC_RESTORESC_MAXIMIZE 的消息。

  2. 创建一个单独的窗口来管理任务栏按钮。不要隐藏该窗口,但您可以使用 0x0 尺寸创建它,或将其移出屏幕。只要知道用户在任务栏按钮上执行的任何活动都将反映在这个单独的窗口上,因此您必须根据需要将任何用户操作委托给您的真实窗口。此外,为了支持任务栏上的实时预览和 Alt-Tab/Flip3D 对话框等功能,您必须处理 WM_DWMSENDICONICLIVEPREVIEWBITMAPWM_DWMSENDICONICTHUMBNAIL 消息,在请求时将您的真实窗口呈现为内存中的 BMP。

话虽如此,这两种方法都是错误的解决方案。

假设这是一个客户端-服务器场景。我不想在客户端上显示一些窗口。但是任务栏上应该有一个图标可以知道客户端正在运行某个应用程序

您不应该使用任务栏只是为了向用户显示应用正在运行而没有可见窗口。这不是任务栏的用途。请改用通知区域(通常称为“系统托盘”)。这正是通知区域所针对的场景。

我不想将它添加到托盘图标中。

无论你想要做什么,这都是你应该做的。这是 Microsoft 期望您做的,也是用户期望的。

您可以在应用运行时在通知区域中显示一个状态图标,如果用户想要更多详细信息,那么您应该在用户点击和/或悬停在图标上时显示一个窗口。

我不想让用户感到困惑。

然后不要做用户没有预料到的事情。自从任务栏在 Windows 95 中首次引入以来,用户已经习惯于只看到任务栏上的可见窗口和系统托盘中的状态图标。不要打破这种期望。并且不要违反 Microsoft 制定的 UI 准则。

  • Following User Interface Guidelines

  • Taskbar

    通常在没有桌面存在的情况下运行的程序应该改用其通知区域图标,即使它可能并不总是可见。

  • Notification Area

    通知区域是任务栏的一部分,为通知和状态提供临时来源。 它还可用于显示桌面上不存在的系统和程序功能的图标。

【讨论】:

  • 我打算使用第一个选项。即使用 SW_MINIMIZE 而不是 SW_HIDE,然后让您的窗口丢弃接收到的任何 WM_SYSCOMMAND 消息,这些消息的 wParam 设置为 SC_RESTORE 或 SC_MAXIMIZE。
  • 有人能帮我怎么做吗?即如何丢弃任何 WM_SYSCOMMAND 消息
  • @Akshatha:到底有什么不清楚的地方?你有一个窗口,它有一个分配给它的窗口过程来处理传入的消息。只需让该过程检查每条消息,如果需要将其丢弃,则不要将其传递给默认消息处理程序。
  • 是的,我已经检查了 Windows 程序中的每条消息。之后如果我不想响应特定消息如何丢弃(就像你说的不要将它传递给默认消息处理程序。怎么做?)
  • @Aks “不要将它传递给默认处理程序”的哪一部分不清楚?只需使用默认结果(通常为零)退出该过程。
猜你喜欢
  • 2014-12-23
  • 1970-01-01
  • 2013-11-05
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 2014-09-04
相关资源
最近更新 更多