启动流程的服务不会显示GUI C#

时间:2010-09-26 16:05:56

标签: c# user-interface process service

嘿,我正在尝试获得一项服务来启动我的程序,但它没有显示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都在那里工作。

关于为什么这不起作用的任何想法?

感谢。

4 个答案:

答案 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