C#启动应用程序,使用StartInfo隐藏或最小化';行不通
我想从Windows服务启动任何外部应用程序。应用程序应隐藏或最小化启动。以下示例显示了我是如何尝试的: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
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
,但没有以这种方式工作。