c# .NEt 3.5 以用户形式运行进程时无法隐藏 CMD 窗口 - 窗体应用程序
Posted
技术标签:
【中文标题】c# .NEt 3.5 以用户形式运行进程时无法隐藏 CMD 窗口 - 窗体应用程序【英文标题】:c# .NEt 3.5 Unable to Hide CMD Window When Running a Process as User - Form Application 【发布时间】:2015-11-11 14:10:21 【问题描述】:我正在尝试使用支持应用程序中的 CMD 提示符在后台运行一堆进程。
我已经成功完成了标准命令,但是当尝试以管理员身份运行命令(检索和结束进程)时,控制台窗口将短暂出现在屏幕上。
代码:
public static bool checkRunning(string procName)
var ss = new SecureString();
ss.AppendChar('T');
ss.AppendChar('a');
ss.AppendChar('k');
ss.AppendChar('e');
ss.AppendChar('c');
ss.AppendChar('a');
ss.AppendChar('r');
ss.AppendChar('e');
ss.AppendChar('9');
ss.AppendChar('9');
ss.MakeReadOnly();
//ProcessStartInfo startInfo = new ProcessStartInfo("cmd", "/C tasklist /S " + Program.servName + " /FI \"SESSION eq " + Program.sessID + "\" /FO CSV /NH")
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.FileName = "cmd.exe";
startInfo.Arguments = "/C tasklist /S " + Program.servName + " /FI \"SESSION eq " + Program.sessID + "\" /FO CSV /NH";
startInfo.WorkingDirectory = @"C:\windows\system32";
startInfo.Verb = "runas";
startInfo.Domain = "mydomain";
startInfo.UserName = "ADMINuser";
startInfo.Password = ss;
startInfo.WindowStyle = ProcessWindowStyle.Hidden;
startInfo.UseShellExecute = false;
startInfo.RedirectStandardOutput = true;
startInfo.CreateNoWindow = true;
string strCheck = " ";
Process proc = Process.Start(startInfo);
proc.OutputDataReceived += (x, y) => strCheck += y.Data;
proc.BeginOutputReadLine();
proc.WaitForExit();
if (strCheck.Contains(procName))
return true;
else
return false;
据我了解,设置 shellExecute=false、createNoWindow=true 和 ProcessWindowStyle.Hidden 应该可以解决问题,但我认为由于需要管理员登录,它无法正常工作。
有没有人知道这个问题的解决方案或合适的解决方法? 任何帮助深表感谢, 非常感谢
【问题讨论】:
【参考方案1】:您可以使用以下代码:
[DllImport("kernel32.dll")]
static extern IntPtr GetConsoleWindow();
[DllImport("user32.dll")]
static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
const int SW_HIDE = 0;
const int SW_SHOW = 5;
static void Main(string[] args)
var handle = GetConsoleWindow();
ShowWindow(handle, SW_HIDE);
【讨论】:
嗨,Jean,感谢您的快速回复。我尝试将上述内容添加到我的 Program.cs 文件中,但 Visual Studio 似乎认为我缺少指令或程序集引用(带有 [DllImport("kernel32.dll")] 的引用)-我把它放在错误的地方吗? 对不起,我忘了补充。您需要参考:System.Runtime.InteropServices; 感谢 Jean - 消除了我看到的错误。我已经完全按照您在上面的方式添加了代码,但我仍然看到执行时出现 CMD 窗口。我是否需要以某种方式将 SW_HIDE 属性附加到发送 CMD 进程的方法? 我尝试像在控制台应用程序中那样运行 cmd.exe 真的很奇怪,但它没有给我窗口输出。 嗨,Jean,这很奇怪 - 我运行的是 Windows 窗体应用程序而不是控制台应用程序吗?【参考方案2】:来自 ProcessStartInfo.CreateNoWindow 属性上的MSDN site:
备注
如果 UseShellExecute 属性为 true 或 UserName 和 Password 属性不为空,忽略 CreateNoWindow 属性值 并创建了一个新窗口。
没有提到解决方法或解决方法,我在任何地方都找不到。
在运行某些进程时,我不得不求助于我的应用程序短暂显示 CMD 窗口(不使用用户名和密码时 CreateNoWindow 属性有效)。
【讨论】:
以上是关于c# .NEt 3.5 以用户形式运行进程时无法隐藏 CMD 窗口 - 窗体应用程序的主要内容,如果未能解决你的问题,请参考以下文章
线程可以作为另一个用户执行吗? (.NET 2.0/3.5)