Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在windows服务中显示窗体。_C#_.net_Forms_Windows Services - Fatal编程技术网

C# 如何在windows服务中显示窗体。

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(); } 你不能那样使用服务。服务无法直接与桌面交互,因为它们在另一个登录用户会话中运行。您需要创建另一个将与您的服务通信的应用程序 如何进行沟通,你可以继续阅读。还介绍了一些想法。对于任何交互式用户,服务都在不同的窗口站

我想在windows服务的OnStart()方法中加载表单;这是我的密码。它不起作用。你能帮忙吗

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:我可以使用任务计划程序吗???我是新程序员,当用户登录和注销时我可以运行任务计划程序吗???