如何在Windows中编写一个最小化到系统托盘的控制台应用程序?

时间:2008-11-06 10:45:28

标签: c++ c windows visual-c++

我编写了一个Visual C ++控制台应用程序(即子系统:控制台),可以向控制台输出有用的诊断消息。

但是,我希望在大多数情况下保持应用程序最小化,而不是最小化到任务栏,在系统托盘上显示为一个漂亮的图标。我还想在单击系统托盘图标时恢复控制台。

如何更改程序以执行此操作?

5 个答案:

答案 0 :(得分:14)

这将是一个丑陋的黑客。

首先,您必须检索控制台应用程序的hWnd / hInstance。现在,我只能想出一个方法:

  • 使用CoCreateGuid()
  • 创建一个Guid
  • 将其转换为字符串
  • 使用SetConsoleTitle()
  • 将控制台窗口的标题设置为此guid
  • 使用Guid作为hWnd
  • 的图块找到窗口的FindWindow()
  • 从这一点开始,你可以从通常的方式做到这一点。 See http://www.gidforums.com/t-9218.html for more info.
  • 完成后,不要忘记将控制台窗口重命名为原始标题。

正如你所看到的,即使这是可能的,但这是一个可怕而痛苦的解决方案。请不要这样做。请不要将控制台应用程序最小化到系统托盘。 这不是您应该在Windows API中执行的操作。

答案 1 :(得分:4)

您可能想要编写一个单独的gui来充当日志阅读器。然后,您会发现将此最小化到托盘更容易。它还可以让你做一些你可能会觉得有用的其他东西,例如更改哪些级别的日志消息在运行中可见。

答案 2 :(得分:1)

要了解控制台,您有两种选择:

  • 在Windows 2000或更高版本中,您可以使用GetConsoleWindow()函数。在包含windows.h以访问此函数之前,不要忘记将_WIN32_WINNT定义为0x0500或更高版本。
  • 如果您想在早期的Windows版本上运行您的程序,那么您必须使用类似上面描述的GUID技巧。

答案 3 :(得分:0)

可能你最好的办法是创建一个"Message-only window"(没有可见窗口的消息队列)来接收通知区消息。

答案 4 :(得分:0)

使用GUID的答案是完全荒谬的(完全没有意义) Console hWnd当然由GetConsoleWindow()(!)

给出