C# 如何在windows服务中显示窗体。
我想在windows服务的OnStart()方法中加载表单;这是我的密码。它不起作用。你能帮忙吗C# 如何在windows服务中显示窗体。,c#,.net,forms,windows-services,C#,.net,Forms,Windows Services,我想在windows服务的OnStart()方法中加载表单;这是我的密码。它不起作用。你能帮忙吗 protected override void OnStart(string[] args) { Form1 fr = new Form1(); fr.Show(); } 你不能那样使用服务。服务无法直接与桌面交互,因为它们在另一个登录用户会话中运行。您需要创建另一个将与您的服务通信的应用程序 如何进行沟通,你可以继续阅读。还介绍了一些想法。对于任何交互式用户,服务都在不同的窗口站
protected override void OnStart(string[] args)
{
Form1 fr = new Form1();
fr.Show();
}
你不能那样使用服务。服务无法直接与桌面交互,因为它们在另一个登录用户会话中运行。您需要创建另一个将与您的服务通信的应用程序
如何进行沟通,你可以继续阅读。还介绍了一些想法。对于任何交互式用户,服务都在不同的窗口站和桌面上运行。即使表单加载成功,也没有人能够看到它 您可以设置“允许服务与桌面交互”服务选项,该选项允许服务共享控制台的窗口站。然而,这是一个非常糟糕的主意。它打开了安全漏洞和一系列其他问题。例如,如果有多个用户登录,会发生什么情况?或者如果您正在运行终端服务
更传统的设计是让客户端应用程序处理UI并与后台运行的服务对话。GUI需要单线程单元线程模型。表单需要一个消息泵(比如由
应用程序启动的消息泵。运行)
服务绝对不是为显示GUI而设计的(即使交互式服务也被认为是不好的做法),它可以通过GUI进行控制。对于要显示窗口的服务,它必须标记为“允许与桌面交互”。这可以由服务安装程序完成,也可以在该服务的属性页上完成
不过,这还不足以让窗口可靠地显示。实际上,您必须确定当前是否有用户登录并获取他们的桌面。这不是一项微不足道的任务,可能是安全问题的根源。如果当前没有人登录,则说明您运气不佳
最好的解决方案是使用一个单独的GUI应用程序,通过某种IPC机制与服务对话。您不需要在服务中加载/显示表单。这就是重点!你为什么要尝试这样做?@PedroC88:我想获得kogin的用户名和时间,以及任何用户的注销,我在form1_load和form1_closing中写下我的代码,然后用我的服务加载我的表单,但它根本不起作用。请注意,人们不会登录/注销该服务。他们将登录并退出使用该服务的应用程序。这种应用程序应该提供数据。服务应该限制自己接收、处理和存储它。@PedroC88:我可以使用任务计划程序吗???我是新程序员,当用户登录和注销时我可以运行任务计划程序吗???