Sah*_*rma 7 .net c# windows-services process process.start
我创建了一个带有Timer的Windows服务,并且在触发事件中timer.Elapsed我正System.Diagnostics.Process.Start(exe path)以5秒的间隔创建一个process().但是这个过程不会在事件发生时创建.
有没有其他方法这样做?
提前致谢.
private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
Process pr = new Process();
pr.StartInfo.FileName = @"C:\Program Files\Messenger\msmsgs.exe";
pr.StartInfo.WindowStyle = ProcessWindowStyle.Normal;
pr.StartInfo.CreateNoWindow = false;
pr.Start();
}
Run Code Online (Sandbox Code Playgroud)
Cod*_*ray 19
您在评论中添加了问题的描述,这将有助于在一开始就知道.您可以看到该进程已启动但没有窗口打开的原因是因为在Windows Vista及更高版本下对Windows服务进行了安全模型更改.你还没有具体提到它,但我强烈怀疑你是否试图在其中一个操作系统下运行它.真正的问题不是开始一个过程,而是显示一个UI.
您要完成的任务称为"交互式服务",它允许直接与用户和桌面交互(即显示窗口或对话框).
如果你使用的是Windows XP(和你的服务只会永远要在Windows XP下运行),您可以按照指示在那篇文章中,以使您的服务交互模式运行,这将让你显示的Adobe Acrobat应用程序窗口如你所料.但是,正如该文档也指出的那样,此功能在Windows Vista及更高版本下不起作用:
重要 服务自Windows Vista起无法直接与用户交互.因此,不应在新代码中使用标题为使用交互式服务的部分中提到的技术.
更具体地说,在这些版本中,对服务和应用程序的运行方式进行了更改.现在,服务在会话0中由系统隔离,而应用程序在其他会话中运行.这旨在将服务与源自应用程序代码的攻击隔离开来.因此,服务显示的UI将不会对系统上的任何用户可见,包括简单的消息框.您可以在此处阅读更详细地解释这些更改的白皮书.如果您是一个更直观的人,请参考下图说明新模型,特别注意分界线:

结果是,如果你的目标是那些版本,或者可能需要针对这些版本,你就不能使用这个漏洞.我说"漏洞",因为我在评论中提到的底线是Windows服务并不打算是交互式的.你在这里尝试做的事情与服务的目的和设计背道而驰.以前不推荐,现在它根本不起作用.如果您需要此特定功能,则应创建不同类型的应用程序.Windows窗体和WPF都适用于用户模式应用程序,并且两者都可以根据需要启动进程并打开新窗口.我强烈建议您转换为这种应用程序.