【问题标题】:Running a console application from the command prompt without it launching a new console window从命令提示符运行控制台应用程序而不启动新的控制台窗口
【发布时间】:2014-06-06 18:09:50
【问题描述】:

如果从命令提示符执行控制台应用程序,是否有办法阻止它启动新的控制台窗口?我不知道为什么我以前从未注意到这一点(或者如果我以前没有对此感到恼火)但我希望能够打开命令提示符,导航到我的控制台应用程序(.exe) is 并在不启动新控制台窗口的情况下运行它。

我已经看到有关如何隐藏控制台窗口的线程,但我的应用程序并不是真的要以自动化方式运行,所以如果他们从资源管理器运行它,我希望他们能看到它。

【问题讨论】:

    标签: c# .net windows windows-console


    【解决方案1】:

    从现有命令行运行控制台应用程序时,不会创建新的控制台窗口:Windows 将重新使用现有窗口。

    PE 可执行文件(即.exe 文件)标有一个标志,告诉操作系统它是否是控制台应用程序:如果它被标记为控制台应用程序,那么 Windows 将重新使用用于启动它的控制台窗口,或者如果它是从 GUI 进程(例如 Windows 资源管理器)启动的,则创建一个新窗口。在 .NET 应用程序中,此标志由项目属性中的应用程序类型下拉菜单控制(其中列出了“Windows 应用程序”、“控制台应用程序”或“类库”)。

    如果您的程序正在创建一个新窗口,那么它可能设置了错误的标志或程序代码手动调用AllocConsole,这将创建一个新的控制台窗口,而不管进程是如何创建的或PE控制台标志。

    更新 还有一个原因:当控制台应用程序在与其(未提升的)父控制台窗口不同的权限级别下运行时,UAC 将要求它位于自己的窗口中。

    【讨论】:

    • 也许这就是我以前从未注意到这一点的原因。就我而言,奇怪的是应用程序属性中的输出类型设置为“控制台应用程序”,而AllocConsole 没有被使用。我能想到的只有另外两件事可能会影响到这里。 1) 该解决方案包含三个项目和一个 Install Shield Setup。一个项目是共享类库,一个是 WPF 应用程序,一个是控制台应用程序。它们并行部署。 2) 控制台应用程序确实有一个 app.manifest,因此它在部署时不会抛出愚蠢的错误。
    • @Ryan 我建议复制您的解决方案,然后删除所有内容,直到达到重现问题所需的最少代码/文件,然后将代码发布到 StackOverflow。
    • 想通了。在我的 app.manifest 中,我将 requestedExecutionLevel 设置为 requireAdministrator,因为该应用程序确实需要管理级别的访问权限。我将值更改为 asInvoker 并在原地执行(如您在上面提到的 Dai)。 UAC 是导致它以这种方式运行的原因。我没有签署文件,因为该应用程序实际上仅供内部使用。无论如何,这似乎是我的真正问题!
    • @Ryan 是的,这是另一个原因。我现在修改我的答案。
    • @Ryan 如果应用程序确实需要管理员访问权限,那么您可以通过另一种方式解决您的问题:从管理命令行窗口而不是常规窗口运行它。 (提示:在 Windows 7 中,按 Windows 键,在开始菜单中键入“cmd”,然后按 CONTROL-ALT-ENTER。在 Windows 8 中,我认为快捷方式是 Windows-X,然后是 A。)
    猜你喜欢
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 2010-11-02
    • 1970-01-01
    • 2011-09-23
    • 2012-09-01
    • 1970-01-01
    相关资源
    最近更新 更多