【问题标题】:Console.Write Not Working In Win Forms AppConsole.Write 在 Win Forms 应用程序中不起作用
【发布时间】:2011-02-07 22:39:21
【问题描述】:

我在 Visual Studio 2008 中创建了一个 VB.NET Windows 窗体应用程序。当我从命令行运行我的程序时,我没有得到任何输出(只有下一个提示)。

我做错了什么?

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Debug.Write("Foo")
    Debug.Flush()
    Console.WriteLine("foo")
    Console.Beep(800, 100) 'confirm this function is called'
    Me.Close()
End Sub

编辑:程序可以有表单和控制台吗?

EDIT2:何的回答有效。但是,输出出现在下一个命令行提示符上。 Winforms 应用程序可以告诉命令行等待它完成而不是立即返回吗?

【问题讨论】:

  • 直接从 Visual Studio 运行时有什么作用吗?由于这是对加载事件的响应并且没有被调用,因此这意味着可能没有创建 Form1。
  • 是的。当我(从 VS 或命令行)运行它时,我确实听到了短促的哔哔声。
  • 您将在 Visual Studio 输出窗口中找到输出。

标签: vb.net winforms console


【解决方案1】:

使用 C# .NET Windows 窗体应用程序测试了类似的代码。在 Visual Studio 中输出和哔声很好,但只有在命令行运行时才会发出哔声。

如果我在项目属性的 Application 选项卡下将 Output Type 更改为 Console Application,我可以同时使用表单和控制台:)

【讨论】:

  • @Oren:例如,将项目更改为控制台应用程序会禁用 Application Framework 开关。这意味着 OP 可能必须编写大量代码来替换该开关免费提供给他的功能。只是为了避免一个互操作调用。因此,在不了解更多 OP 情况的情况下,我不同意一个答案比另一个更好。
  • @ho1 使用互操作,我的 winform 会生成一个新的控制台窗口,一旦我的应用程序终止,它就会立即消失。这使得我的 winform 的命令行集成非常混乱,例如写myApp.exe /? 会闪烁一个控制台窗口,该窗口会立即消失。由于我几乎没有使用 winforms 和谷歌搜索 what is application framework 返回太笼统的结果的经验,我问你:我为什么需要这个 Application Framework
  • @Nolonar:请参阅此页面Application Page, Project Designer,特别是Windows 应用程序框架属性 部分中的位。这将向您展示在启用框架的情况下自动完成的一些事情。
【解决方案2】:

您可以使用myApp.exe|MORE从控制台运行您的应用程序
这样,控制台将显示来自应用程序的Console.WriteLine() 调用,并等待应用程序退出。
请原谅我的英语不好。

【讨论】:

  • 效果很好!感谢您的简单回答。
【解决方案3】:

其他人说您需要将您的应用程序作为控制台应用程序运行是正确的。关于您是否可以同时拥有控制台和 GUI 的问题:是的。只需在您的项目中添加对 System.Windows.Forms 的引用,并为应用程序的 Main 方法添加以下代码:

' here instantiate whatever form you want to be your main form '
Dim f As New Form1

' this will start the GUI loop, which will not progress past '
' this point until your form is closed '
System.Windows.Forms.Application.Run(f)

【讨论】:

    【解决方案4】:

    或者,如果您已经有一个 WinForms 应用程序,您可以使用 AttachConsole API 将控制台附加到它。

    using System.Runtime.InteropServices;  
    

    ...

    [DllImport("kernel32.dll")] static extern bool AttachConsole(int dwProcessId);
    private const int ATTACH_PARENT_PROCESS = -1;  
    

    ...

    AttachConsole(ATTACH_PARENT_PROCESS);
    

    (格式化为代码)

    【讨论】:

    • VB 版本的这个作品。但是,输出出现在下一个命令行提示符之后。我现在正试图弄清楚如何防止命令行立即返回。
    • 您可以执行“START yourapp.exe /WAIT”以使命令行等待,但我认为这不会完全满足您的需求。
    【解决方案5】:

    尝试使用“控制台应用程序”模板创建一个新项目。

    【讨论】:

      【解决方案6】:

      解决办法是:

      Declare Function AttachConsole Lib "kernel32.dll" (ByVal dwProcessId As Int32) As Boolean
      Declare Function FreeConsole Lib "kernel32.dll" () As Boolean
      

      [代码.....]

      当需要控制台输出时,您只需调用 AttachConsole(-1) 但记得在程序结束时执行 FreeConsole()。

      这个解决方案的唯一问题是你会读到这样的东西:

      C:>yourapp.exe
      C:>世界你好!

      这是因为表单应用程序作为命令提示符的子项运行,因此在您键入应用程序名称后立即返回提示符。

      在控制台应用程序中,命令提示符在程序退出后返回。

      我仍在尝试找到一种与控制台应用程序具有相同行为(同步运行)的方法。

      【讨论】:

      • 稍微作弊,在最后加上Console.Write(String.Format("{0}>", AppDomain.CurrentDomain.BaseDirectory.TrimEnd(IO.Path.DirectorySeparatorChar)))。好吧,它只有在用户有默认提示 ($P$G) 时才有效,但我认为这适用于所有情况的 99.99%。
      【解决方案7】:

      您必须创建命令行/控制台应用程序而不是 Windows 窗体应用程序才能使用控制台。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-04
        • 2014-05-05
        相关资源
        最近更新 更多