如何在Windows中编写一个控制台应用程序,使其最小化到系统托盘? 我有一个Visual C++控制台应用程序(即子系统:控制台),它向控制台打印有用的诊断信息。

如何在Windows中编写一个控制台应用程序,使其最小化到系统托盘? 我有一个Visual C++控制台应用程序(即子系统:控制台),它向控制台打印有用的诊断信息。,c++,c,windows,visual-c++,C++,C,Windows,Visual C++,但是,我希望在大多数情况下保持应用程序最小化,而不是最小化到任务栏,而是在系统托盘上显示一个漂亮的图标。我还想在单击系统托盘图标时恢复控制台 我应该如何改变我的程序来做到这一点?这将是一个丑陋的黑客行为 首先,您必须检索控制台应用程序的hWnd/hInstance。现在,我只能想出一个办法: 使用CoCreateGuid()创建Guid 将其转换为字符串 使用SetConsoleTitle() 使用FindWindow() 从这一点上,你可以用通常的方法来做 完成后,不要忘记将控制台窗口重命名

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


我应该如何改变我的程序来做到这一点?

这将是一个丑陋的黑客行为

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

  • 使用
    CoCreateGuid()创建Guid
  • 将其转换为字符串
  • 使用
    SetConsoleTitle()
  • 使用
    FindWindow()
  • 从这一点上,你可以用通常的方法来做
  • 完成后,不要忘记将控制台窗口重命名为原始标题

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

您可能需要编写一个单独的gui来充当日志读取器。然后,您会发现将此最小化到托盘上要容易得多。它还可以让你做一些你可能觉得有用的其他事情,例如更改即时可见的日志消息的级别。

也许你最好的办法是创建一个(没有可见窗口的消息队列)来接收通知区消息。

带有GUID的答案是完全荒谬的(毫无意义)
控制台hWnd当然是由GetConsoleWindow()提供的(!)

要了解控制台的hWnd,您有两个选择:

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