我必须创建一个需要某些参数的控制台应用程序.如果它们丢失或错误,我会打印出错误信息.
现在问题是:如果有人通过双击控制台窗口从资源管理器启动程序立即消失.(但是应用程序对于资源管理器来说并不是完全无用的,你可以将文件拖到它上面它会起作用)
我总是可以等待按键,但如果用户确实从命令行启动它,我不希望这样.
有没有办法区分这些情况?
出于学习目的,我正在用c#和winforms开发一个类生成应用程序.我认为包含允许在脚本中使用应用程序的命令行模式可能没什么问题.
在我的应用程序中包含命令行模式是一个好习惯吗?最好有两个不同的程序,一个是GUI,一个用于命令行?
我正在编写一个实用程序(http://reg2run.sf.net),如果没有参数的执行作为Windows应用程序(显示OpenFileDialog等),否则 - 作为控制台应用程序.
因此,在第一种情况下,我不想显示控制台窗口,这就是为什么项目是Windows应用程序.但在第二个 - 我需要展示它,它是用它创建的
if (ptrNew == IntPtr.Zero)
{
ptrNew = GetStdHandle(-11);
}
if (!AllocConsole())
{
throw new ExternalCallException("AllocConsole");
}
ptrNew = CreateFile("CONOUT$", 0x40000000, 2, IntPtr.Zero, 3, 0, IntPtr.Zero);
if (!SetStdHandle(-11, ptrNew))
{
throw new ExternalCallException("SetStdHandle");
}
StreamWriter newOut = new StreamWriter(Console.OpenStandardOutput());
newOut.AutoFlush = true;
Console.SetOut(newOut);
Console.SetError(newOut);
Run Code Online (Sandbox Code Playgroud)
我想要的是 - 获取父进程标准输出并使用它,如果它存在(如果通过cmd.exe或远程管理器执行).我该怎么做?
我试过了
static Process GetParentProc()
{
int pidParent = 0;
int pidCurrent = Process.GetCurrentProcess().Id;
IntPtr hSnapshot = CreateToolhelp32Snapshot(2, 0);
if (hSnapshot == IntPtr.Zero)
{
return null;
} …Run Code Online (Sandbox Code Playgroud)