C#启动应用程序,使用StartInfo隐藏或最小化';行不通

C#启动应用程序,使用StartInfo隐藏或最小化';行不通,c#,C#,我想从Windows服务启动任何外部应用程序。应用程序应隐藏或最小化启动。以下示例显示了我是如何尝试的: static void Main(string[] args) { Process process = new Process(); process.StartInfo.FileName = "C:\\Windows\\System32\\mspaint.exe"; //process.StartInfo.FileName = "C:\\Windows\\system

我想从Windows服务启动任何外部应用程序。应用程序应隐藏或最小化启动。以下示例显示了我是如何尝试的:

static void Main(string[] args)
{
    Process process = new Process();
    process.StartInfo.FileName = "C:\\Windows\\System32\\mspaint.exe";
    //process.StartInfo.FileName = "C:\\Windows\\system32\\calc.exe";
    process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
    process.StartInfo.CreateNoWindow = true;
    process.StartInfo.UseShellExecute = true;
    //process.StartInfo.UseShellExecute = false;
    process.Start();
}
对于MSPaint,它可以工作,但对于计算器则不行。对于命令
UseShellExecute
,我尝试了
true
false
,但对于计算器,没有任何效果

有人能解释为什么它适用于某些应用程序,如MSPaint.exe,而不适用于其他应用程序,如Calc.exe吗?还有没有其他方法可以启动隐藏或最小化的应用程序


编辑:好的,我现在明白了。我将我的程序作为控制台应用程序进行了测试,因此我不必总是在编译后重新安装服务。但是由于会话0隔离,我无法显示从我的服务启动的GUI程序。那是个愚蠢的主意。

我就是这样让它工作的:

public const int SC_MINIMIZE = 6;

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

static void Main(string[] args)
{
    Process p = new Process();
    p.StartInfo.FileName = "calc.exe";
    p.Start();
    while (string.IsNullOrEmpty(p.MainWindowTitle))
    {
        Thread.Sleep(50);
        p.Refresh();
    }
    ShowWindow(p.MainWindowHandle, SC_MINIMIZE);
}

这将在窗口完全加载后使其最小化。不太漂亮,但可以完成任务。

“通过Windows服务”-对于任何现代操作系统(从Vista开始),由服务启动的任何应用程序都不应该在任何地方显示任何UI。事实上,通常人们正试图做相反的事情(让服务启动一个确实向“用户”显示但不起作用的应用程序),你看不到从服务启动的程序创建的UI。服务会话也对这样的程序进行了非常严格的限制,它使用一个小的桌面堆运行。你可以使用计算器这样的现代用户界面程序的可能性应该很小。不要这样做。您是否尝试了
Process.WaitForInputIdle
方法而不是while循环?这确实有效吗?就像你从一个服务和计算器中运行这段代码一样?哪里在你的桌面上?这怎么可能呢?该服务未在您的桌面上运行!我在我的桌面上运行了这段代码,它打开了计算器并立即将其最小化。尝试了
进程。WaitForInputdle
,但没有以这种方式工作。