Windows 终端在使用 SW_HIDE 时最小化而不是隐藏

问题描述 投票:0回答:1

我正在 GoLang 中创建一个程序,它有一个可选的控制台窗口。在正常操作期间,窗口将完全隐藏(包括任务栏),用户将通过系统托盘与其交互。当用户按下托盘中的按钮时,我想要一个显示/隐藏控制台窗口的选项。我以前在 C# 中这样做过:

using System.Runtime.InteropServices;

[DllImport("kernel32.dll")]
static extern IntPtr GetConsoleWindow();

[DllImport("user32.dll")]
static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

const int SW_HIDE = 0;
const int SW_SHOW = 5;

var handle = GetConsoleWindow();

// Hide
ShowWindow(handle, SW_HIDE);

// Show
ShowWindow(handle, SW_SHOW);

为了在 Go 中做到这一点,我使用了这个包:https://github.com/lxn/win。这个包是 Go 的 WinAPI 包装器,可以让我使用所有相同的命令。这是我用来做与上面的 C# 代码相同的事情的代码:

win.ShowWindow(win.GetConsoleWindow(), win.SW_SHOW)

现在这实际上在 Windows 10 上按预期完美运行,默认情况下不使用 Windows 终端。我正在运行确实使用 Windows 终端的 Windows 11,所以我认为这就是它没有隐藏的原因。相反,它只是最小化窗口而不是隐藏它。我是否可以强制我的 Go 程序不使用 Windows 终端,或者最好让 Windows 终端像使用命令提示符一样隐藏?

感谢您的帮助

编辑:在 Windows 终端中,您可以转到设置并将默认终端应用程序设置为“Windows 控制台主机”,这将使用命令提示符,但这是计算机范围的。这确实解决了这个问题。我希望这仅适用于我的程序,所以问题仍然存在,但只是记下它。

go winapi command-prompt windows-terminal
1个回答
0
投票

我不认为你可以强制你的程序使用命令提示符,但我想我可能已经找到了解决方案。

我也有这个问题但是我在python上使用相同的代码/方法所以如果答案不合适我想提前道歉。

所以基本上你需要做的是使用

SetForegroundWindow
API 来设置你从
GetConsoleWindow
获得的句柄。

在此之后,您需要使用

GetForegroundWindow
从前台窗口获取句柄。

现在如果你使用隐藏窗口

// Hide
ShowWindow(handle, SW_HIDE);

它会正确地从任务栏中隐藏自己。

python 中的示例代码:

import ctypes
import win32.lib.win32con as win32con
import win32gui # pip install pywin32
from time import sleep

kernel32 = ctypes.WinDLL('kernel32')
user32 = ctypes.WinDLL('user32')

a = input('Input value here:')

# get the console window
hWnd = kernel32.GetConsoleWindow()

# set it as foreground
win32gui.SetForegroundWindow(hWnd) 

# get the foreground window
hWnd = win32gui.GetForegroundWindow() 

# hide it 
win32gui.ShowWindow(hWnd, win32con.SW_HIDE)
print("I'm hidden!")

sleep(2)

# show again
win32gui.ShowWindow(hWnd, win32con.SW_SHOW)
print("I'm not hidden anymore!")

希望对你有帮助,如果没帮助我很抱歉

© www.soinside.com 2019 - 2024. All rights reserved.