从窗口服务显示窗体
我正在创建一个窗口服务。 我的要求是在特定的时间间隔内从窗口NT服务显示窗口窗体。 出于测试目的,我只想在服务启动时显示表单:
protected override void OnStart(string[] args) { eventLog1.WriteEntry("In OnStart -before form show"); Messager_Form obj = new Messager_Form(); obj.Show(); // System.Diagnostics.Process.Start("calc.exe"); eventLog1.WriteEntry("In OnStart -after form show"); // timer1.Start(); }
它不起作用。 两种forms都没有显示,也没有计算过程。 我发现一些链接显示弹出 ,但大多数建议WCF。 没有wcf是不可能的。 任何人都可以告诉我实现这一目标的方法。
不能做*。 在以后不能用作Windows服务的操作系统中,不允许与桌面交互 – 而是由Windows服务提供的UI显示在会话0中 ,这是一个特殊的登录会话,通常对最终用户不可见。
您应该做的是编写一个单独的Windows窗体应用程序,该应用程序始终在运行,但并不总是可见(可能在启动时运行该应用程序并在通知区域中有一个图标)并使用某种forms的IPC与Windows服务进行通信
当Windows服务希望向用户显示某些UI时,它会向应用程序发送一条消息,然后该消息向最终用户显示所需的UI。
**或者至少绝对不应该这样做*
我只是提到StackOverflow中另一个链接中给出的答案
如何从与桌面交互的应用程序与Windows服务进行通信?
答案是:
请注意,如果您计划最终部署在Windows Vista或Windows Server 2008上,那么今天可以采用的许多方法都不起作用。 这是因为引入了一种名为“Session 0 Isolation”的新安全function。
现在,大多数Windows服务已被移动到会话0中运行,以便将它们与系统的其余部分正确隔离。 对此的扩展是,第一个登录系统的用户不再被放置在会话#0中,它们被放置在会话1中。因此,隔离将破坏在服务和桌面应用程序之间进行某些类型通信的代码。
在服务和应用程序之间进行通信时,今天编写适用于Vista和Server 2008的代码的最佳方法是使用正确的跨进程API,如RPC,命名管道等。不要使用SendMessage / PostMessage,因为这样做在会话0隔离下失败。
https://www.microsoft.com/whdc/system/vista/services.mspx
现在,根据您的要求,您将会陷入困境。 对于跨平台问题,我不确定是否支持Remoting。 你可能需要下载并一直回到套接字: http : //msdn.microsoft.com/en-us/library/system.net.sockets.aspx
检查“与桌面交互”框将在Windows NT,2000,XP和2003上运行,但由于会话0隔离 ,设置不再像Windows Vista及更高版本中那样有效。 在开发交互式服务之前,您需要仔细考虑 …
上述就是C#学习教程:从窗口服务显示窗体分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1013251.html