嘿,我正在尝试获得一项服务来启动我的程序,但它没有显示GUI。该过程开始但没有显示任何内容。我尝试启用“允许服务与桌面交互”,但仍然无效。 我的程序是一个计算机锁定设备,用于阻止未经授权的用户访问计算机。我正在使用64位操作系统运行Windows 7。
以下是我服务的代码:
protected override void OnStart(string[] args)
{
Process p = new Process();
p.StartInfo.FileName = "notepad.exe";
p.Start();
FileStream fs = new FileStream(@"C:\Users\David\Documents\Visual Studio 2010\Projects\LockPCService\LockPCService\bin\Debug\ServiceLog.dj",
FileMode.OpenOrCreate, FileAccess.Write);
StreamWriter m_streamWriter = new StreamWriter(fs);
m_streamWriter.BaseStream.Seek(0, SeekOrigin.End);
m_streamWriter.WriteLine(" LockPCService: Service Started " + DateTime.Now + "\n" + "\n");
m_streamWriter.Flush();
m_streamWriter.Close();
}
protected override void OnStop()
{
FileStream fs = new FileStream(@"C:\Users\David\Documents\Visual Studio 2010\Projects\LockPCService\LockPCService\bin\Debug\ServiceLog.dj",
FileMode.OpenOrCreate, FileAccess.Write);
StreamWriter m_streamWriter = new StreamWriter(fs);
m_streamWriter.BaseStream.Seek(0, SeekOrigin.End);
m_streamWriter.WriteLine(" LockPCService: Service Stopped " + DateTime.Now + "\n"); m_streamWriter.Flush();
m_streamWriter.Close();
}
尝试让服务正常工作我正在使用notepad.exe。当我查看进程记事本正在运行但没有GUI。每次运行时,ServiceLog都在那里工作。
关于为什么这不起作用的任何想法?
感谢。
答案 0 :(得分:21)
This article解释了Session 0 Isolation
,其中不允许服务在Windows Vista / 7中创建UI。在您的服务启动另一个进程时,它从会话0开始,也不会显示任何UI。 (顺便说一下,创建了UI,只是永远不会显示Session 0)。 CodeProject上的This article可以帮助您从用户桌面上的服务创建流程并显示其UI。
另外,请考虑将流对象包裹在using
statement中,以便妥善处理它们。
答案 1 :(得分:4)
服务在不同的帐户下运行,因此记事本由另一个用户和另一个桌面运行,这就是您无法看到它的原因。从Vista开始,不再支持“允许服务与桌面交互”。
答案 2 :(得分:4)
我知道这是一篇迟到的帖子,但我发现this article对我很有帮助。我正在运行Windows 7,本文提供的解决方案效果很好。
如果您下载代码,则会有一个名为ApplicationLoader
的类。在项目中包含该类,然后就像这样简单:
// the name of the application to launch
String applicationName = "cmd.exe";
// launch the application
ApplicationLoader.PROCESS_INFORMATION procInfo;
ApplicationLoader.StartProcessAndBypassUAC(applicationName, out procInfo);
答案 3 :(得分:2)
服务在不同的登录会话中运行,并且与用户具有不同的窗口站。这意味着所有GUI活动都与用户的程序隔离,而不是服务无法显示GUI。实际上,这种设计使临时阻止访问用户程序变得更加容易。
您需要致电SwitchDesktop。