我搜索了有关如何隐藏自己的控制台窗口的信息.令人惊讶的是,我能找到的唯一解决方案是通过其标题FindWindow()找到控制台窗口的 hacky解决方案.我深入挖掘了Windows API,发现有更好更简单的方法,所以我想在这里发布,供其他人查找.
如何隐藏(和显示)与我自己的C#控制台应用程序关联的控制台窗口?
VS2012似乎删除了VS2010中TFS签到的弹出窗口.它现在似乎接管了我的侧边栏中的团队资源管理器选项卡,并掩盖了重要的事情 - 比如我改变了哪些文件.有没有办法在VS2012中返回正常的弹出窗口进行签到?
我正在尝试为自己自动执行某些任务,并编写了一些.NET Core 1.0控制台应用程序.其中之一是BrowserRouter--一个简单的应用程序,基于url模式,决定在我点击http(s)链接时打开哪个浏览器/浏览器配置文件.
这工作正常,但总会出现控制台窗口,并立即消失.
有没有办法静默运行.NET Core控制台应用程序(隐藏控制台窗口)?
我知道在完整的.NET Framework中,可以将输出类型更改为Windows应用程序,但是对于.NET Core,这是不可用的(但是?).
这看起来像是一项不可能的任务.绝对没有我找到的作品.问题是如何干净地关闭以Process.Start启动的控制台应用程序,该控制器应用程序在没有控制台窗口且没有使用shell执行的情况下启动:( ProcessStartInfo.CreateNoWindow = true; ProcessStartInfo.UseShellExecute = false;).
如果它接收到ctrl-c或ctrl-break信号,那么正在启动的应用程序将"干净地"关闭,但似乎没有办法发送一个有效的应用程序(特别是GenerateConsoleCtrlEvent).
任何能够提供接受"Process"对象的代码的人都将被标记为答案,该代码以上述参数开始,这些对象导致已启动进程的干净关闭而不影响调用进程.使用7z.exe(7-zip归档程序)作为示例控制台应用程序,它开始压缩大文件,如果没有干净地终止,将留下损坏的未完成文件.
直到有人提供了通向功能示例的功能例子或代码,这个问题没有答案.我见过几十个人在网上问这个问题和几十个答案,但都没有..NET似乎不支持干净地关闭控制台应用程序给定其进程ID,考虑到它是从.NET进程对象开始的,这很奇怪.部分问题是无法在新进程组中创建进程,这使得使用GenerateConsoleCtrlEvent无用.必须有一个解决方案.
我知道您可以创建一个Windows窗体应用程序并将其设置为不可见.如果我创建一个控制台应用程序(控制台窗口将打开 - 我对控制台没用),我该如何创建一个根本没有GUI的简单应用程序?
这是我的情景:
我正在将PDF文件转换为通过C#调用Ghostscript的PNG图像.这是我使用的参数字符串:
-dNOPAUSE -dBATCH -dFirstPage=1 -q -r300 -sDEVICE=png256 -sOutputFile=...
Run Code Online (Sandbox Code Playgroud)
但是,通过这种方式,当我调用Ghostscript时,它会显示一个窗口(在我添加之前-q)有输出消息.
我试过添加-dNODISPLAY之后-r300.但是这样Ghostscript不起作用,也不会创建图像.
问题: 我可以通过哪种方式抑制输出窗口?
我创建了一个小型C#程序,它与Web服务联系并检索和处理数据集.经过一些头脑刮擦和探索stackOverflow之后没有问题 - 感谢所有贡献者.
我通常在Linux世界工作,所以这是对Windows环境的罕见尝试.我需要做的就是设置它以便TaskScheduler运行这个应用程序.没有控制台显示或交互,所有内容都写入日志文件.
在Linux中我只使用CRONTASK,但在Windows中有些不同.这是吗?对吗?这样做的方法,因为它将每天运行一次?我考虑过一个Windows服务,但有一定程度的复杂性,我不确定是否合理.
思考?
我想从C#启动一个外部程序来完全分离.我通过pinvoke使用CreateProcess,因为Process.Start不允许我使用DETACHED_PROCESS.此外,我希望此应用程序将其输出重定向到某个文件.
这是示例代码:
var processInformation = new ProcessUtility.PROCESS_INFORMATION();
var securityInfo = new ProcessUtility.STARTUPINFO();
var sa = new ProcessUtility.SECURITY_ATTRIBUTES();
sa.Length = Marshal.SizeOf(sa);
// Create process with no window and totally detached
var result = ProcessUtility.CreateProcess(Path.Combine(Environment.SystemDirectory, "cmd.exe"), commandLineArguments, ref sa, ref sa, false,
ProcessUtility.DETACHED_PROCESS, IntPtr.Zero, null, ref securityInfo, out processInformation);
Run Code Online (Sandbox Code Playgroud)
CommandLineArguments是这样的:"/ c Foo.bat> Foo.log 2>&1"一切正常,Foo.bat填充Foo.log.没有其他控制台窗口可见.完善.
CommandLineArguments是这样的:"/ c Foo.exe> Foo.log 2>&1"Foo.exe是.NET控制台应用程序.未填充Foo.log并在可见控制台窗口中启动Foo.exe.奇怪.为什么行为与1不同?
仅供参考.CommandLineArguments是这样的:"/ c Foo.exe> Foo.log 2>&1"Foo.exe是.NET Windows应用程序.一切正常,但当我从命令提示符启动此应用程序时,我看不到输出,因为没有分配控制台.
我想2.工作与1.相同为什么有区别?
更新:我不想为自己编写Foo.log,因为启动应用程序将被终止.
更新:好的,我编写了一些代码来指定只有一个句柄被继承但是当使用EXTENDED_STARTUPINFO_PRESENT调用时,CreateProcess会给出错误87(即使它存在且为空).
你能帮帮我吗?
public class ProcessUtility
{
// Process creation flags
const uint ZERO_FLAG = 0x00000000; …Run Code Online (Sandbox Code Playgroud) 我有一个模块需要运行一个小的.Net命令行程序来检查更新.一切都很好,但是我无法抑制显示命令提示输出.
该应用程序拥有自己的Windows窗体,如果它检测到更新,它会弹出.更新需要作为单独的应用程序运行,因为它需要与启动它的DLL不同的执行上下文.
string path = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location) + "\\" + AUTO_UPDATE_EXENAME;
updater.StartInfo.FileName = path;
updater.StartInfo.Arguments = AUTO_UPDATE_PARAMETERS;
updater.StartInfo.CreateNoWindow = false;
updater.StartInfo.UseShellExecute = false;
updater.StartInfo.RedirectStandardOutput = true;
updater.StartInfo.WorkingDirectory = path;
updater.Start();
Run Code Online (Sandbox Code Playgroud)
我曾经最尝试了所有的不同工作组合CreateNoWindow,UseShellExecute和RedirectStandardOutput他们每个人在这恼人的黑盒子结果弹出.该应用程序写入stdout但我只使用它进行调试,用户不应该真正看到它生成的文本.
据说CreateNoWindow和/或RedirectStandardOutput应该防止弹出框,但无论我如何设置这些变量都是如此.
可能重复:
如何在隐藏控制台的情况下运行C#控制台应用程序.
通过类库如何在后台运行控制台应用程序来执行任务,然后告诉我的方法完成处理?
c# ×8
.net ×2
console ×2
process ×2
windows ×2
.net-core ×1
batch-file ×1
break ×1
class ×1
cmd ×1
command-line ×1
ghostscript ×1
service ×1
tfs ×1