【问题标题】:Opening a process in C# with hidden window在 C# 中使用隐藏窗口打开进程
【发布时间】:2012-10-23 06:34:12
【问题描述】:

我有一个在本地机器上启动进程的功能:

public int StartProcess(string processName, string commandLineArgs = null)
{
    Process process = new Process();
    process.StartInfo.FileName = processName;
    process.StartInfo.Arguments = commandLineArgs;
    process.StartInfo.UseShellExecute = false;
    process.StartInfo.CreateNoWindow = true;
    process.StartInfo.ErrorDialog = false;
    process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
    process.Start();
    return process.Id;
}

它应该在不打开新窗口的情况下启动该过程。事实上,当我用 timeout.exe 测试它时,没有打开控制台窗口。但是当我使用 notepad.exe 或 calc.exe 对其进行测试时,它们的窗口仍然打开。

我在网上看到这种方法适用于其他人。我在 Windows 7 x64 上使用 .NET 4.0。

我做错了什么?

【问题讨论】:

  • 它对其他人有用的来源是什么?
  • 我认为没有一种通用的方法可以启动另一个可执行文件,然后防止该可执行文件决定打开自己的窗口。
  • 我同意@Damien_The_Unbeliever。一般来说,如果一个进程决定打开一个窗口,它需要用户交互,所以它通常在没有窗口的情况下无法运行。与控制台应用程序不同,您可以在其中以编程方式读取和写入标准输入/输出。
  • stackoverflow.com/questions/3011209/…。 Chris Schmich 说它可以在他的机器上运行。 @AlvinWong
  • @Damien_The_Unbeliever 谢谢。我会坚持只隐藏控制台应用程序。

标签: c#


【解决方案1】:

CreateNoWindow 标志仅适用于控制台进程。

详情请看这里:

其次,应用程序可以忽略 WindowStyle 参数 - 它在新应用程序第一次调用 ShowWindow 时生效,但后续调用在应用程序的控制之下。

【讨论】:

  • 这就是我添加隐藏窗口样式的原因。
【解决方案2】:

以下程序将显示/隐藏窗口:

using System.Runtime.InteropServices;
class Program
{
    [DllImport("user32.dll")]
    static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

    [DllImport("user32.dll")]
    static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

    const int SW_HIDE = 0;
    const int SW_SHOW = 5;

    static void Main()
    {
        // The 2nd argument should be the title of window you want to hide.
        IntPtr hWnd = FindWindow(null, "Untitled - Notepad");
        if (hWnd != IntPtr.Zero)
        {
            //ShowWindow(hWnd, SW_SHOW);
            ShowWindow(hWnd, SW_HIDE); // Hide the window
        }
    }
}

来源:http://social.msdn.microsoft.com/Forums/en-US/csharplanguage/thread/1bc7dee4-bf1a-4c41-802e-b25941e50fd9

【讨论】:

  • 当您查看 OPStartProcess 方法的第 4 行时,you 看到了什么? (嗯。也许我记错了,或者我下意识地从 0 开始数,但希望这一点仍然有效)
  • @Damien_The_Unbeliever:是的,错过了。
  • +1 这似乎是最强大的方法,例如它适用于其他方法失败的 calc 。除了 findwindow ,您还可以获得进程的句柄。然后像你一样,隐藏进程` IntPtr blah=p.MainWindowHandle; ShowWindow(blah, SW_HIDE);`
【解决方案3】:

您需要删除process.StartInfo.UseShellExecute = false

    public int StartProcess(string processName, string commandLineArgs = null)
    {
        Process process = new Process();
        process.StartInfo.FileName = processName;
        process.StartInfo.Arguments = commandLineArgs;
        process.StartInfo.CreateNoWindow = true;
        process.StartInfo.ErrorDialog = false;
        process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
        process.Start();
        return process.Id;
    }

【讨论】:

  • 你在 calc 上测试过这个吗?
  • 使用 cmd.exe 进行测试(而不是控制台应用程序项目)。我同意You need to remove the process.StartInfo.UseShellExecute = false,但奇怪的是msdn.microsoft.com/en-us/library/… 说“要使用 ProcessWindowStyle.Hidden,ProcessStartInfo.UseShellExecute 属性必须为 false。”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-13
  • 2019-01-05
  • 1970-01-01
相关资源
最近更新 更多