项目需求:

1、程序可以最小化到任务栏

2、tpms标签和限速标签同时只能选择一个,并且要通过button确定修改

3、在程序中需要显示SequenceScanner1.0服务的运行状态

4、能够打开和关闭SequenceScanner1.0服务

5、在程序中建立一个链接,指向配置文件的地址

开发环境:Visual Studio2015基于.NET Framework3.5

实现步骤:

1、以管理员权限,新建一个winform项目,

2、设计程序界面

3、实现程序缩小化至任务栏小图标功能

A、拖动控件notifyIcon到设计界面,修改窗体关闭事件

  1. private void Form1_FormClosing(object sender, FormClosingEventArgs e) //程序关闭时最小化至任务栏
  2. {
  3. if(e.CloseReason==CloseReason.UserClosing) //当用户点击右上角X按钮或者Alt+F4时
  4. {
  5. e.Cancel = true;
  6. this.ShowInTaskbar = false; //判断是否显示窗体
  7. this.myIcon.Icon = this.Icon; //显示任务栏小图标
  8. this.Hide(); //隐藏icon控件
  9. }
  10. }

B、修改notifyIcon的单击事件

  1. private void myIcon_MouseClick(object sender, MouseEventArgs e) //单击任务栏图标事件
  2. {
  3. if(e.Button==MouseButtons.Right) //如果鼠标右击任务栏图标
  4. {
  5. myMenu.Show(); //展示选项
  6. }
  7. if(e.Button==MouseButtons.Left) //如果鼠标左击任务栏图标
  8. {
  9. this.Visible = true;
  10. this.WindowState = FormWindowState.Normal; //显示程序窗体
  11. }
  12. }

C、拖动一个ContextMenuStrip控件作为icon的右键菜单选项,其中设置一个退出选项,修改其click事件

  1. private void 退出ToolStripMenuItem_Click(object sender, EventArgs e) //任务栏图标右击退出程序
  2. {
  3. //弹出提示框,决定是否退出,如果确定就往下执行
  4. if (MessageBox.Show("您确定要退出程序吗?", "确认退出", MessageBoxButtons.OKCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.OK)
  5. {
  6. this.myIcon.Visible = false; //任务栏图标消失
  7. this.Close(); //关闭窗体
  8. this.Dispose(); //释放程序使用的资源
  9. Application.Exit(); //退出程序
  10. }
  11. }

4、通过button打开配置文件地址(绝对路径下)

  1. private void openfilepath_Click(object sender, EventArgs e)
  2. {
  3. //这是绝对路径
  4. string path1 = @"C:\Windows\System32"; //地址位置
  5. System.Diagnostics.Process.Start("explorer",path1);
  6. //如有必要可添加为相对路径
  7. }

5、引用能够对服务进行调用的库

6、获取服务状态(输入服务名称)

  1. public void CheckServerState(string ServiceName) //检测服务状态函数
  2. {
  3. ServiceController[] service = ServiceController.GetServices();
  4. bool isStart = false;
  5. bool isExite = false;
  6. for(int i=0;i<service.Length;i++)
  7. {
  8. if(service[i].ServiceName.ToUpper().Equals(ServiceName.ToUpper()))
  9. {
  10. isExite = true;
  11. if(service[i].Status==ServiceControllerStatus.Running)
  12. {
  13. isStart = true;
  14. break;
  15. }
  16. }
  17. }
  18. if(!isExite) //服务是否存在
  19. {
  20. this.ServiceStatus.Text = ("不存在此服务");
  21. }else
  22. {
  23. if(isStart) //服务是否启动
  24. {
  25. this.ServiceStatus.Text = ("此服务已启动");
  26. }
  27. else
  28. {
  29. this.ServiceStatus.Text = ("此服务已关闭");
  30. }
  31. }
  32. }
  33. private void getServerStatus_Click(object sender, EventArgs e) //服务检测
  34. {
  35. // CheckServerState("SequenceScanner1.0"); //服务名称,不是显示名称
  36. CheckServerState("iphlpsvc"); //测试用---服务名称,不是显示名称
  37. }

7、打开服务/关闭服务(输入显示名称)

打开服务

  1. //首先根据服务状态决定打开/关闭服务
  2. if (ServiceStatus.Text == "不存在此服务")
  3. {
  4. MessageBox.Show("此服务未存在");
  5. }
  6. if (ServiceStatus.Text == "此服务已启动")
  7. {
  8. MessageBox.Show("服务已启动");
  9. }
  10. if (ServiceStatus.Text == "此服务已关闭")
  11. {
  12. // ServiceController sc = new ServiceController("SequenceScanner1.0");
  13. ServiceController sc = new ServiceController("IP Helper"); //测试服务
  14. if(!sc.CanStop)
  15. {
  16. sc.Start(); //启动服务,不传递参数
  17. sc.WaitForStatus(ServiceControllerStatus.Running); //服务当前状态
  18. ServiceStatus.Text = ("此服务已启动");
  19. }
  20. sc.Close(); //释放对该服务的控制权以及相应的资源
  21. }
  22. }

关闭服务

  1. private void closeService_Click(object sender, EventArgs e) //关闭服务
  2. {
  3. if (ServiceStatus.Text == "不存在此服务")
  4. {
  5. MessageBox.Show("此服务未存在");
  6. }
  7. if (ServiceStatus.Text == "此服务已关闭")
  8. {
  9. MessageBox.Show("服务已关闭");
  10. }
  11. if (ServiceStatus.Text == "此服务已启动")
  12. {
  13. // ServiceController sc = new ServiceController("SequenceScanner1.0");
  14. ServiceController sc = new ServiceController("IP Helper"); //测试服务
  15. if (sc.CanStop)
  16. {
  17. sc.Stop(); //停止服务
  18. sc.WaitForStatus(ServiceControllerStatus.Stopped); //服务当前状态已停止
  19. ServiceStatus.Text = ("此服务已关闭");
  20. }
  21. sc.Close(); //释放对该服务的控制权以及相应的资源
  22. }
  23. }

8、鼠标悬停在帮助按键,显示提示功能

  1. private void help_Click(object sender, EventArgs e) //当鼠标悬停时,启动提示
  2. {
  3. ToolTip ttpSetting = new ToolTip(); //提示控件
  4. ttpSetting.InitialDelay = 50;
  5. ttpSetting.AutoPopDelay = 10 * 1000; //提示可见时间
  6. // ttpSetting.ReshowDelay = 100;
  7. ttpSetting.ShowAlways = true; //是否总显示提示窗口
  8. // ttpSetting.IsBalloon = true;
  9. ttpSetting.SetToolTip(this.help, "联系电话:18914250037"); //显示提示内容
  10. }

附件列表

voith项目配置服务程序的更多相关文章

  1. Project server 2016 “没有为此项目配置网站”错误处理

    问题: 没有为此项目配置网站. There is no site configured for this project 解决办法: 依次点击设置>PWA设置>连接到sharepoint网 ...

  2. thinkphp3.22 多项目配置

    1.index.php if(version_compare(PHP_VERSION,'5.3.0','<')) die('require PHP > 5.3.0 !'); // 开启调试 ...

  3. VS2010的项目配置

    一直对VS的项目配置都是不怎么了解的,以前用过点,半年不用后,什么都忘记了... 下面这个是免于输入过长的引用头文件的,比如:#include “D:/C++/curl-7.37.0/libcurl/ ...

  4. VC项目配置基础以及快捷键(收藏)

    来自http://blog.csdn.net/phunxm/article/details/5082488 一.IDE基础配置 1.字体 VC6中“Tools→Options→Format→Font” ...

  5. ThinkPHP多应用/项目配置技巧(使用同一配置文件)--(十六)

    原文:ThinkPHP多应用/项目配置技巧(使用同一配置文件)--(十六) ThinkPHP多应用配置技巧(没有使用分组,这是通过入口文件产生的Home.Admin)----很实用! 比如:现在有Ho ...

  6. 理解 IntelliJ IDEA 的项目配置和Web部署

    1.项目配置的理解 IDEA 中最重要的各种设置项,就是这个 Project Structre 了,关乎你的项目运行,缺胳膊少腿都不行.最近公司正好也是用之前自己比较熟悉的IDEA而不是Eclipse ...

  7. 在找一份相对完整的Webpack项目配置指南么?这里有

    Webpack已经出来很久了,相关的文章也有很多,然而比较完整的例子却不是很多,让很多新手不知如何下脚,下脚了又遍地坑 说实话,官方文档是蛮乱的,而且有些还是错的错的..很多配置问题只有爬过坑才知道 ...

  8. ASP.NET Core 项目配置 ( Startup )(转载)

    原文:https://www.twle.cn/l/yufei/aspnetcore/dotnet-aspnet-startup.html 由于是个人网站,怕没了,特意复制保存,个人觉得讲的非常透彻 前 ...

  9. Intellij IDEA导入eclipse项目配置jdk、tomcat到浏览器正常访问

    转发自:博客园---Lindp(大佬写的甚好) 以下是转发的正文 intellij idea中文资料网上比较少,对于eclipse的项目如何导入intellij idea也没有完整的说明,本人在这里整 ...

随机推荐

  1. ECMAScript——(二)

    1.语法 区分大小写 变量是弱类型(定义变量时只用 var 运算符,可以将它初始化为任意值.) 每行结尾的分号可有可无(建议写上) 注释与Java一样 括号表示代码块 2.变量 变量可以不用声明,变量 ...

  2. Linux SSH Backdoor分析排查

    1.SSH后门分类 SSH后门方式有以下几种 软链接 SSH Server wrapper SSH Keylogger 2.软链接 利用方法 [root@helen]# ln -sf /usr/sbi ...

  3. 使用RegSetValueEx修改注册表时遇到的问题(转)

    原文转自 http://blog.csdn.net/tracyzhongcf/article/details/4076870 1.今天在使用RegSetValueEx时发现一个问题: RegSetVa ...

  4. checkbox 全选和取消

    //全选 $("#checkall").click(function () { if (this.checked) { //如果当前点击的多选框被选中 $('input[type= ...

  5. tensorflow中的boolean_mask

    将mask中所有为true的抽取出来,放到一起,这里从n维降到1维度 tensor = [[1, 2], [3, 4], [5, 6]] import numpy as np mask=np.arra ...

  6. Dropout caffe源码

    GPU和CPU实现的不一样,这里贴的是CPU中的drop out 直接看caffe里面的源码吧:(产生满足伯努利分布的随机数mask,train的时候,data除以p,...... scale_ = ...

  7. ExtJs的Reader

    ExtJs的Reader Reader : 主要用于将proxy数据代理读取的数据按照不同的规则进行解析,讲解析好的数据保存到Modle中 结构图 Ext.data.reader.Reader 读取器 ...

  8. 【Netty官方文档翻译】引用计数对象(reference counted objects)

    知乎有关于引用计数和垃圾回收GC两种方式的详细讲解 https://www.zhihu.com/question/21539353 原文出处:http://netty.io/wiki/referenc ...

  9. 关于json中转义字符/正斜杠的问题。

    1.首先有关转义字符 可以看百度百科: 先不管/是否需要转义,我们去json的官方网站去看看:http://www.json.org/ 可见有这个,那么意思是 json中 又规定建议了一下,意思是虽然 ...

  10. INSTEAD OF与AFTER触发器

    INSTEAD OF 触发器 AFTER 触发器(也叫“FOR”触发器)会在触发 insert.update 或是delect 动作之后执行.例如,一个 Employees 表上的 AFTER 触发器 ...