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。
- 用户应该可以随时通过系统托盘图标停止服务
答案 0 :(得分:0)
有很多方法可以在Windows下登录时启动应用程序。只需抓住SysInternals AutoRuns即可获得一个想法。显而易见的是(a)良好的'启动组'和(b)其中一个
\SOFTWARE\Microsoft\Windows\CurrentVersion\Run*
HKCU和/或HKLM下的钥匙。这是设置实用程序的典型任务,因为您必须安装该服务才有意义。要在代码中执行此操作:
注册表:打开注册表项,添加条目,关闭注册表项。
启动:使用SHGetFolderPath确定CSIDL_STARTUP
或CSIDL_COMMON_STARTUP
的值,然后在该文件夹中确定create a Shell Link。
GUI部分实现TrayIcon并通过一些channnel与您的服务进行通信。同样,有很多可能性如何做到这一点,如磁盘文件或内存映射文件,命名管道,甚至套接字。如果在这里列出所有方法,那就太宽泛了,所以我建议你选择一种方式,再问一下你是否对这个问题有具体的问题。
要停止代码服务,请使用ControlService()功能并将SERVICE_CONTROL_STOP
作为dwControl
参数传递。要启动服务,还有另一个名为(big surprise)StartService()的函数来实现这一目标。请注意,您可能需要启动应用的提升副本来控制服务。快速和快速肮脏的方法是简单地用必要的args启动net start/stop MyService
。