当前位置: 首页 > news >正文

windows service 与GUI窗口的实现

以前做过几次windows service,但都是没有界面的,想配置参数都只能使用文本文件,然后重启服务才行,而且不能查看服务的运行状态。
最近在网上找到一些文章,终于找到可以启动服务时有界面的方法。
首先服务工程中本身不能有窗体,这是WINDOWS系统本身不支持的。因此必须要有两个工程才能实现,一是服务程序,另一个是GUI程序。
当服务程序启动时通过代码启动GUI程序,从而实现自动启动GUI程序,并且有界面展示。为了能让服务程序能与GUI程序通信,可以在服务程序中建立一个TCP server,
GUI程序中建立一个tcp client,这样两个程序之间即可实现通信。
要使服务程序能打开GUI程序,并在窗口中显示出来,必须在安装服务之后设置其启动帐号为”本地系统帐号“且“允许与桌面交互”。
而”本地系统帐号“这项可以在服务程序开发时设置,而“允许与桌面交互”必须要使用另外的途径实现,请参考下面的代码。

具体步骤:
先建立一个WINFORM 程序。
然后再建立一个windows service project. (具体操作不在此说明)。
在serviceInstaller1_Committed事件中添加如下代码:

 ConnectionOptions coOptions = new ConnectionOptions();
            coOptions.Impersonation = ImpersonationLevel.Impersonate;
            ManagementScope mgmtScope = new System.Management.ManagementScope(@"root\CIMV2", coOptions);

            mgmtScope.Connect();
            ManagementObject wmiService;
            wmiService = new ManagementObject("Win32_Service.Name='" + serviceInstaller1.ServiceName + "'");

            ManagementBaseObject InParam = wmiService.GetMethodParameters("Change");

            InParam["DesktopInteract"] = true;

            ManagementBaseObject OutParam = wmiService.InvokeMethod("Change", InParam, null);
此段代码即是将此Service设置为“允许与桌面交互”,有了此选项之后,服务启动时GUI程序的界面将会出现。

编译之后,将gui程序放在合适的位置,安装服务,并设置为自启动服务,针对windows2000/xp系统,启动服务时将会出现GUI程序的界面,如果调用没有出错的话。

要注意的是在windows 2003上启动服务时界面可能不会出现(虽然在服务管理器中“允许与桌面交互”已经勾上),但程序已经在运行(通过任务管理器查看)。
有两个解决办法,一是重启机器;二是在“服务管理器”中手工重新设置一下“允许与桌面交互”,然后确定,此时再启动服务即可(其实未做任何修改,搞不懂MS的东西为什么会这样,跟踪了注册表,也没看到有变化)。

使用双进程实现服务和GUI的好处是,可以随时查看服务的状态,并且GUI程序当掉之后,服务程序可以自动将其启动,有点象木马了。

参考地址:
双进程实现示例,只是用的是VC++,难度有点大,可以直接使用其XLogOff.exe服务程序,只是需要把里面的XLGUI替换为你的GUI程序。当然,最好的方法是参考这个服务用C#重写,应该比较容易的。
http://www.codeproject.com/useritems/xlogoff.asp
中国人自己做的,将任何程序做成服务启动程序的工具:
http://www.codeproject.com/system/xyntservice.asp
另一个讲述如何自动设置“允许与桌面交互”选项的,未成功,不知重启之后是否有效。
http://www.codeproject.com/csharp/CsWindowsServiceDesktop.asp
另一篇说明如何设置“允许与桌面交互”选项的
http://www.dotnet247.com/247reference/msgs/36/184247.aspx

相关文章:

  • linux中查看nginx、apache、php、mysql配置文件路径的方法
  • 笑话集合
  • 斐波南希数列
  • linux文件权限管理与ACL访问控制列表
  • 马云为什么这么红?(转)
  • 详解SpringMVC中Controller的方法中参数的工作原理[附带源码分析] good
  • 2006IBM 杯中国高校 SOA 应用大赛题目
  • 移动端压缩上传图片
  • [导入]对于adapter模式的类示配模式的java和c#的语法比较
  • MicroPython控制8*8LED点阵显示温度
  • 2006年四月五日
  • C语言项目参考解答:全正整数后再计算
  • 基于.Net Framework的N层分布式应用开发
  • Spring-mvc 静态资源不拦截
  • 一次CA证书服务器+IIS SSL的实验心得
  • C# 免费离线人脸识别 2.0 Demo
  • Create React App 使用
  • crontab执行失败的多种原因
  • extjs4学习之配置
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • Python - 闭包Closure
  • Redash本地开发环境搭建
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • vue学习系列(二)vue-cli
  • vue总结
  • Web设计流程优化:网页效果图设计新思路
  • 表单中readonly的input等标签,禁止光标进入(focus)的几种方式
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 写代码的正确姿势
  • 学习JavaScript数据结构与算法 — 树
  • 自制字幕遮挡器
  • 你对linux中grep命令知道多少?
  • const的用法,特别是用在函数前面与后面的区别
  • Java性能优化之JVM GC(垃圾回收机制)
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • 你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • # include “ “ 和 # include < >两者的区别
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (4)STL算法之比较
  • (52)只出现一次的数字III
  • (动态规划)5. 最长回文子串 java解决
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (五)IO流之ByteArrayInput/OutputStream
  • (五)Python 垃圾回收机制
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • (转)scrum常见工具列表
  • .NET Core IdentityServer4实战-开篇介绍与规划
  • .net下简单快捷的数值高低位切换
  • @31省区市高考时间表来了,祝考试成功
  • [ vulhub漏洞复现篇 ] Hadoop-yarn-RPC 未授权访问漏洞复现
  • [20170705]lsnrctl status LISTENER_SCAN1
  • [2024最新教程]地表最强AGI:Claude 3注册账号/登录账号/访问方法,小白教程包教包会