WPF控制台应用程序未返回提示符

3

我有一个WPF“控制台”应用程序,其中包含以下应用程序类:

public partial class App : Application
{
    [DllImport("kernel32.dll", SetLastError = true)]
    static extern bool AttachConsole(uint dwProcessId);

    [DllImport("kernel32.dll", SetLastError = true)]
    static extern bool FreeConsole();

    const uint ATTACH_PARENT_PROCESS = 0x0ffffffff;

    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);

        AttachConsole(ATTACH_PARENT_PROCESS);

        Console.WriteLine("test1");

        FreeConsole();

        System.Environment.Exit(0);
    }
}

当我从控制台启动它时,“test1”文本会出现,但是控制台光标只是闪烁,直到我按下Enter键才会出现提示符。我已经删除了StartupURI语句。 如何强制应用程序像控制台应用程序一样行为,并在执行后返回提示符?(Windows 7 32位)。


2
将WPF库添加到程序中并不会使程序成为WPF应用程序,就像添加DirectX库并不会使您的程序成为DirectX应用程序一样。如果您想要一个控制台应用程序,请从控制台模板开始。添加Windows模板只会与您的目标产生冲突,并浪费很多人的时间来帮助您。 - Bahri Gungor
该应用程序应该能够在GUI和无GUI/命令行模式下工作。 - Greg
1
在这种情况下,我仍然会从命令行应用程序模板开始,然后只有在需要时才构建WPF应用程序/引导加载程序对象。你的应用程序启动代码应该驻留在静态Main方法中。正如你所拥有的那样,你依赖于默认的WPF启动代码,但是在OnStartup事件处理程序上终止应用程序。 - Bahri Gungor
我遇到了完全相同的问题,你修复好了吗? - Chris
1个回答

0

不要将其设置为Windows应用程序输出,而是使用控制台应用程序输出类型。唯一的缺点是,当Windows应用程序正在运行时,控制台会保持打开状态。我猜想你可以获取控制台的进程ID,在启动后可能能够终止它。


你真的测试过吗?它并没有解决我提到的问题。如果我将控制台应用程序作为输出类型,当我运行应用程序时,控制台会弹出 - 我不想要那个... - Greg
应用程序的输出类型并不像程序结构那样重要。目前,您正在使用App.OnStartup()事件方法来运行应用程序。通过使用App类,您将控制权让给了WPF/Windows。程序的入口点对您而言是隐藏的。但是,如果您将应用程序更改为从Main方法启动,则可以绕过WPF启动,以便在希望程序以控制台模式运行时使用。我将在几分钟内为您编写一个小的启动类作为示例。 - Bahri Gungor
我做的事情完全一样 - 但是当我从提示符开始它时,它不会像“控制台应用程序”那样返回到提示符。它将显示文本“test1”并闪烁光标,直到我按下回车键。 - Greg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接