【问题标题】:How to set the output handle to opened console in a Windows application如何在 Windows 应用程序中将输出句柄设置为打开的控制台
【发布时间】:2017-08-06 17:32:52
【问题描述】:

我有一个 WinForm 项目,可以打开一个控制台进行调试。这在 C++ 中的游戏开发中非常常见。当我在 C# 中尝试这个时,我没有得到想要的结果。我想是因为我需要将标准输出设置到控制台。

我在关注这个: http://vbcity.com/blogs/jatkinson/archive/2010/02/17/windows-interop-inside-kernel32-part-1-allocconsole-amp-createhardlink.aspx

虽然它使用了 Console.WriteLine(),但它会跳过将输出句柄设置到控制台。如何在 C# 中设置它?

我的代码:

namespace MVS
{
    public partial class frmMVS : Form
    {
        [DllImport("kernel32")]
        static extern bool AllocConsole();

        public frmMVS()
        {
            InitializeComponent(); 

            AllocConsole(); 
            Console.WriteLine("Hello World!");
        } 
    }
}

当前尝试(尽管没有任何内容输出到控制台): 来源:No console output when using AllocConsole and target architecture x86

namespace MVS
{
    public partial class frmMVS : Form
    { 
        public frmMVS()
        {
            InitializeComponent();

            CreateConsole();

            Console.WriteLine("Hello World!");
        }

        public static void CreateConsole()
        {
            AllocConsole();

            // stdout's handle seems to always be equal to 7
            IntPtr defaultStdout = new IntPtr(7);
            IntPtr currentStdout = GetStdHandle(StdOutputHandle);

            if (currentStdout != defaultStdout)
                // reset stdout
                SetStdHandle(StdOutputHandle, defaultStdout);

            // reopen stdout
            TextWriter writer = new StreamWriter(Console.OpenStandardOutput())
            { AutoFlush = true };
            Console.SetOut(writer);
        }

        // P/Invoke required:
        private const UInt32 StdOutputHandle = 0xFFFFFFF5;
        [DllImport("kernel32.dll")]
        private static extern IntPtr GetStdHandle(UInt32 nStdHandle);
        [DllImport("kernel32.dll")]
        private static extern void SetStdHandle(UInt32 nStdHandle, IntPtr handle);
        [DllImport("kernel32")]
        static extern bool AllocConsole();
    }
}

目前的解决方案: 目前,我当前的解决方案是删除所有这些互操作代码并将输出类型设置为我的 Windows 应用程序中的控制台应用程序。这允许表单和控制台并排工作。因为运行应用程序的用户也会看到控制台,所以请记住在发布之前将输出类型设置回 Windows。由于控制台无论如何都用于调试,因此这似乎是一个简单的解决方案。我不知道在我开发过程中它会如何影响解决方案,因此仍然感兴趣的替代方案。

【问题讨论】:

  • 抱歉,如果我误解了,但你试过Debug.WriteLine()吗?
  • 是的,这也不显示任何输出。事实上,控制台窗口也没有打开。当我打开控制台窗口时,它仍然没有显示任何输出。
  • 对于游戏,没有。使用 VS 查找是一团糟。我需要控制台窗口。我上面的解决方案是临时的,但它现在可以工作,直到我找到相关的响应。

标签: c# winforms


【解决方案1】:

出于调试目的,这个简单的解决方案最终对我来说很有效:

在您的 Windows 窗体项目中,1) 转到项目 -> 我的项目 属性 -> 将“Windows 应用程序”的输出类型设置为“控制台” 应用'。 2) 保存,就完成了。

现在您可以像通常使用 Console.WriteLine() 一样输出到控制台进行调试。

注意:确保在发布之前将输出类型切换回“Windows 应用程序”,否则用户将看到控制台窗口。

【讨论】:

  • 这不是削减它。我在同一个问题上苦苦挣扎了很长一段时间,并找到了两个可行的解决方案。一段时间后,他们俩都不知何故停止了工作。问题是,如果您正在开发(即 WPF 应用程序),则不能只更改项目类型。此外,您想显示控制台和 WPF 窗口 - 这并不容易。
猜你喜欢
  • 2023-03-23
  • 1970-01-01
  • 2010-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多