是否可以实用地设置输出类型?或者如何添加属性组条件?



>我正在使用命令行应用程序输出类型对应用程序进行编程,以在控制台中显示调试信息。

我想在编译应用程序以发布时隐藏控制台。不显示控制台可以通过进入项目属性、应用程序选项卡并将输出类型更改为 Windows 应用程序来轻松完成。

但无论如何,我想让用户有机会即使在发布中也能使用控制台打开应用程序。为此,我添加了Dev按钮,当用户单击它时,我希望应用程序打开控制台,其中包含所有调试日志输出。

我在SO上找到了这样的答案

https://stackoverflow.com/a/7828186/5709159

如果发布控制台中的应用程序未打开,则当开发控制台中的应用程序也打开时,它是有效的。

所以,我看到了两种可能的方法

  1. 当用户处于释放模式时,他可以单击Dev按钮,控制台将使用所有以前的日志打开。
  2. 将一些变量(如DevMode(添加到Properties文件中,如上面的链接所示。当用户处于发布模式时,他可以单击Dev按钮,我保存DevMode = true(在文件中(,用户需要重新加载应用程序并再次打开应用程序,但现在我可以看到DevMode == true,并据此打开应用程序与控制台即使在发布模式下

问题是 - 有可能做到吗?

控制台是一个非常古老的东西,其限制可以追溯到早期的DOS时代。当Windows和图形用户界面的想法还没有正确完成时。除非您习惯于处理本机 Windows API 调用,否则这很可能不是您可以更改的。

话虽如此:

  • 您可以在 GUI 应用程序普通窗口的平行显示控制台。它确实使用了本机API调用,但就这些调用而言似乎相对容易。从无显示应用程序显示控制台也可能有效。
  • 也许模仿控制台窗口就足够了?如果程序启动控制台程序,它可以隐藏控制台窗口并重定向输入和输出流。然后,您可以创建一个表单窗口,该窗口模仿普通控制台,并允许用户通过这些流与不可见的控制台进行通信。

您可以将程序编译为控制台应用程序(即使它是 Windows 窗体应用程序(,并使用以下代码以编程方式隐藏控制台窗口:

void HideConsole()
{
MyConsole.HideConsole();
}
internal class MyConsole
{
[DllImport("kernel32.dll")]
static extern IntPtr GetConsoleWindow();
[DllImport("user32.dll")]
static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
[DllImport("kernel32")]
static extern bool AllocConsole();
const int SW_HIDE = 0;
const int SW_SHOW = 5;
public static void HideConsole()
{
var handle = GetConsoleWindow();
// Hide
ShowWindow(handle, SW_HIDE);
}
public static void ShowConsole()
{
AllocConsole();
}
}

还有另一种方法,将程序编译为 Windows 窗体应用程序并以编程方式显示控制台窗口:

void ShowConsole()
{
MyConsole.ShowConsole();
}

但请注意,这段代码可能无法直接在Visual Studio中工作,因为Visual Studio可能会重定向控制台输入。但是,如果您直接运行应用程序,它应该可以正常工作。

最新更新