【问题标题】:How to show/hide windows console in systray?如何在系统托盘中显示/隐藏 Windows 控制台?
【发布时间】:2020-05-07 10:55:47
【问题描述】:

我正在完成一个 python 程序,我将作为 exe 分发。 我在 Windows 10 64b 上使用 Python 3.7。

用户将双击 exe 来运行我的程序。然后会打开一个 Windows 控制台并在此控制台中显示日志。

我的程序不需要任何 gui,但我想让用户可以隐藏带有日志的控制台,并在他/她想要从系统托盘中的图标时将其显示回来。

我在这里找到了各种答案,但没有一个能满足我的需求。

我想我不是那种想在我们的 python 脚本上使用这个选项的人。它可能非常有用。

我找到了一个在 python 中构建系统托盘图标的教程:

https://youtu.be/WM27fMo5Gg8

但它是关于打开 Windows 程序,而不是关于显示/隐藏它自己的控制台。

【问题讨论】:

    标签: python python-3.x windows systray


    【解决方案1】:

    经过进一步调查,我找到了解决方案。当我在终端中运行我的脚本时它可以工作。我仍然没有使用我的程序的 exe 进行测试。如果 .exe 文件需要一些额外信息,我可能会回来编辑我的答案。

    1. 我为 python 2 找到了这个著名的脚本 SystrayIcon.py,它可以帮助我快速创建带有菜单的图标。
    2. 我找到了这个脚本的 Python 3 版本here
    3. 然后我使用类型中的 GetConsoleWindow 和 win32gui 中的 ShowWindow 来隐藏和显示控制台。

      定义显示(sysTrayIcon):

      the_program_to_hide = ctypes.windll.kernel32.GetConsoleWindow()
      
      win32gui.ShowWindow(the_program_to_hide, win32con.SW_SHOW)
      

      def 隐藏(sysTrayIcon):

      the_program_to_hide = ctypes.windll.kernel32.GetConsoleWindow()
      
      win32gui.ShowWindow(the_program_to_hide, win32con.SW_HIDE)
      

    这两个功能都连接到我的系统托盘图标的菜单。

    我希望有一天它会对某人有所帮助。

    PS:StackOverflow 编辑器错误,我无法正确显示 2 个函数的代码。

    【讨论】:

    • 这仅适用于由 conhost.exe 实现的系统控制台窗口。如果您的程序从另一个终端(例如新的 Windows 终端应用程序)运行,它将无法工作。但是,它真的不应该隐藏交互式终端。在尝试通过ShowWindow 隐藏窗口之前,您应该检查GetConsoleWindow() 的结果不是NULL (0)。在两种情况下它可能为 0:如果通过 DETACHED_PROCESS 创建标志在没有控制台的情况下执行,或者通过CREATE_NO_WINDOW 创建标志在没有窗口的情况下执行。
    • 仅供参考,您也可以使用 ctypes 调用 ShowWindowuser32 = ctypes.WinDLL('user32', use_last_error=True); SW_HIDE = 0; SW_SHOW = 5。然后通过was_visible = user32.ShowWindow(hwnd, SW_HIDE)隐藏。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-31
    • 2011-09-27
    • 1970-01-01
    • 2011-07-23
    • 1970-01-01
    • 2011-01-26
    • 2011-11-19
    相关资源
    最近更新 更多