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 窗口 - 窗体应用程序的主要内容,如果未能解决你的问题,请参考以下文章

vb.net,c# 关于隐式类型转换的问题?

C# .net 3.5 进程间通信验证子进程是不是启动正常

线程可以作为另一个用户执行吗? (.NET 2.0/3.5)

检测是不是从在 3.5 上运行的 C# 代码安装了 MSBuild/.net 4?

C# .NET 3.5 对象序列化字符串

.NET 3.5 JIT 在运行应用程序时不起作用