Windows服务和应用程序交互

时间:2013-12-13 17:21:07

标签: c# visual-studio-2010 user-interface service system-tray

TL; DR: 我有一个服务,一个gui和一个托盘图标。我想知道如何让托盘图标在用户登录/启动时运行,并能够停止服务并启动gui

一些背景信息:

  

我有一个我使用xml文件收集的Windows服务   来自我网络上其他计算机的文件并将它们存储在本地   pc(运行服务)。 xml有一些叫做的结构   'profiles',其中包含FileDestination,LocationToTakeFrom等信息,   FileTypeToTake和IsProfileActive ......

     

该服务基本上采用所有活动配置文件和每小时   扫描在1小时窗口内创建的文件的位置   本地PC上的当前日期/时间。

     

我的GUI允许用户制作配置文件/修改配置文件,如   以及确定哪些配置文件应该是有效的收集。一世   我不希望这个gui一直在运行,所以我打算有一个   systemTrayIcon允许打开和关闭此GUI。

我正在使用Visual Studio 2010 .NET 4.0,一切都在C#中,我有1个独立项目的解决方案(gui和服务)

我想知道系统托盘图标的下列内容:

1)如何在用户登录时启动图标(请注意,这将通过安装程序分发,而不仅仅是我个人使用。所以必须通过代码完成)

2)通过sysTrayIcon停止服务

3)在哪里放置SysTrayIcon ...我是否制作了第3个项目?将它添加到GUI项目中?在这里不太确定。

4)如果SysTrayIcon是在一个单独的项目中,我怎么能让它创建GUI的实例? 即如何从不同项目中的代码启动GUI应用程序

项目要求是:

-upon安装GUI必须启动,之后只能通过托盘图标访问Gui。

- 用户应该可以随时通过系统托盘图标停止服务

1 个答案:

答案 0 :(得分:0)

启动客户端

有很多方法可以在Windows下登录时启动应用程序。只需抓住SysInternals AutoRuns即可获得一个想法。显而易见的是(a)良好的'启动组'和(b)其中一个

\SOFTWARE\Microsoft\Windows\CurrentVersion\Run* 
HKCU和/或HKLM下的钥匙。这是设置实用程序的典型任务,因为您必须安装该服务才有意义。要在代码中执行此操作:

  • 注册表:打开注册表项,添加条目,关闭注册表项。

  • 启动:使用SHGetFolderPath确定CSIDL_STARTUPCSIDL_COMMON_STARTUP的值,然后在该文件夹中确定create a Shell Link

服务通讯&控制

GUI部分实现TrayIcon并通过一些channnel与您的服务进行通信。同样,有很多可能性如何做到这一点,如磁盘文件或内存映射文件,命名管道,甚至套接字。如果在这里列出所有方法,那就太宽泛了,所以我建议你选择一种方式,再问一下你是否对这个问题有具体的问题。

要停止代码服务,请使用ControlService()功能并将SERVICE_CONTROL_STOP作为dwControl参数传递。要启动服务,还有另一个名为(big surprise)StartService()的函数来实现这一目标。请注意,您可能需要启动应用的提升副本来控制服务。快速和快速肮脏的方法是简单地用必要的args启动net start/stop MyService