相关疑难解决方法(0)

双击时暂停批处理文件,但从控制台窗口运行时不能暂停?

有没有办法批处理文件(在这种情况下,在Windows XP上运行)来确定它是从命令行启动(即在控制台窗口内)还是通过shell启动(例如通过双击)?

我有一个脚本,我希望在通过shell运行时在某些点暂停,但不是在命令行运行时.我在SO上看到过类似的问题,但由于两个原因我无法使用相同的解决方案:首先,它是否暂停需要依赖于多个因素,其中只有一个是双击.其次,我将把这个脚本分发给我团队中的其他人,我无法真实地要求他们所有人进行注册表更改,这将影响所有脚本.

这可能吗?

windows batch-file

24
推荐指数
2
解决办法
5715
查看次数

是否可以构建一个双击时不显示控制台窗口的控制台应用程序?

相关:
我应该在我的应用程序中包含命令行模式吗?
如何获取父进程标准输出?
控制台应用程序可以检测它是否已从资源管理器运行?

我想构建一个控制台应用程序,通常从命令行运行.

但是,当它从资源管理器中双击(而不是从cmd.exe提示符运行)时,我希望该程序不显示控制台窗口.

我想避免这个:

替代文字http://i36.tinypic.com/1088p5s.jpg

可能吗?

编辑我想另一种问题是,程序是否有可能知道它是如何被调用的 - 无论是通过双击还是通过命令行

我在Windows上使用.NET.

编辑2:这篇Old New Thing博客文章中我学到了一些好东西.这就是我现在所知道的......

在Windows中,EXE文件标记为GUI或非GUI.使用csc.exe,可以使用/target:winexe或选择它/target:exe.在执行流程中的第一条指令之前,Windows内核会设置执行环境.此时,如果EXE标记为GUI,则内核将进程的stdin/stdout设置为NULL,如果非GUI(命令行),则内核创建控制台并将进程的stdin/stdout设置为安慰.

启动进程时,如果没有stdin/stdout(== /target:winexe),则立即返回调用.因此,从cmd.exe启动gui应用程序,您将立即返回cmd提示符.如果存在stdin/stdout,并且从cmd.exe运行,则父cmd.exe将等待进程退出.

"立即返回"很重要,因为如果您编写GUI应用程序以附加到其父控制台,您将能够执行console.writeline等.但cmd.exe提示是活动的.用户可以键入新命令,启动新进程等.换句话说,从winexe,只需附加到父控制台,AttachConsole(-1)不会"变成"控制台应用程序.


此时我认为允许应用程序使用控制台的唯一方法是从cmd.exe调用它,而不是在双击时使用它,就是将exe定义为常规控制台exe(/target:exe),并且如果合适,在启动时隐藏窗口.您仍然会暂时显示控制台窗口.

我仍然没有想过如何知道它是从explorer或cmd.exe启动的,但我越来越近了..


解答

无法构建不显示控制台窗口的控制台应用程序.

是可能的构建非常迅速隐藏其窗口控制台应用程序,但不能如此之快,这是因为如果从来没有出现的窗口.

现在,为了确定是否从资源管理器启动了一个控制台应用程序,有些人建议查看它正在运行的控制台
(来自mgb的答案知识库文章99115):

  int left = Console.CursorLeft;
  int top = Console.CursorTop;
  bool ProcessWasRunFromExplorer = (left==0 && top==0);
Run Code Online (Sandbox Code Playgroud)

这告诉您该进程是否在其自己的控制台中启动,而不是它是否是资源管理器.在资源管理器中双击可以执行此操作,但是应用程序内的Start.Process()也会执行相同的操作.

如果要以不同方式处理这些情况,请使用此方法来了解父进程的名称:

  System.Console.WriteLine("Process id: {0}", Process.GetCurrentProcess().Id);
  string name = Process.GetCurrentProcess().ProcessName ;
  System.Console.WriteLine("Process name: {0}", …
Run Code Online (Sandbox Code Playgroud)

.net windows console console-application

19
推荐指数
3
解决办法
8026
查看次数

如何确定控制台应用程序的启动方式?

如何通过双击EXE(或快捷方式)来判断用户是否已启动我的控制台应用程序,或者是否已打开命令行窗口并在该会话中执行我的控制台应用程序?

.net c# console command-line console-application

4
推荐指数
1
解决办法
1990
查看次数

具有GUI和控制台模式的WPF应用程序

我知道从控制台窗口运行WPF应用程序并输出到控制台而不是显示gui(又名本问题)存在问题.

该问题的"结论"(似乎已经得到很好的研究和提出)是可以从应用程序输出到控制台,但它会立即返回 - 而不是像控制台应用程序那样阻塞.

但是,查看Visual Studio特别是'devenv.exe'进程,这正是它所做的事情:

  • 从资源管理器中双击devenv.exe只运行应用程序gui.
  • 在控制台(cmd.exe)窗口中
    • devenv.exe<enter> 运行Gui立即返回控制台
    • devenv.exe /?<enter> 在控制台中显示帮助,仅在显示所有输出后返回.
    • devenv.exe test.txt<enter> 运行Gui(加载test.txt)立即返回控制台

因此,必须有可能以某种方式在我们自己的应用程序中出现这种行为!有谁知道怎么样?

.net wpf console

2
推荐指数
1
解决办法
3808
查看次数