从窗口服务显示窗体
我正在创建一个窗口服务。 我的要求是在特定的时间间隔内从窗口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隔离下失败。
http://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#和C ++之间的桥梁
- global.asax和global.asax.cs之间有什么区别
- 在匿名类型自动初始化中是重要的字段顺序?
- UnauthorizedAccessException:Silverlight应用程序中的无线跨线程访问(XAML / C#)
- 下拉列表更好地作为ViewBag或模型C#/ .NET MVC4的一部分
- 找出是否有人登录gmail,yahoo和facebook
- linq-to-sql或linq在什么时候向数据库发送请求
- WinRT:使用GetFileFromApplicationUriAsync()加载静态数据
- 哪个本地数据库适用于Windows 8商店应用?