项目需求:

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. jQuery文档处理(追加删除)——(三)

    1.追加内容

  2. javascript中用闭包递归遍历树状数组

    做公司项目时,要求写一个方法,方法的参数为一个菜单数组集合和一个菜单id,菜单数组的格式为树状json,如下面所示: [{"id":28,"text":&quo ...

  3. 【小程序开发总结】微信小程序开发常用技术方法总结

    1.获取input的值 <input bindinput="bindKeyInput" placeholder="输入同步到view中"/>   b ...

  4. python网络编程--进程池

    一:进程池 进程池内部维护一个进程序列,当使用时,则去进程池中获取一个进程, 如果进程池序列中没有可供使用的进进程,那么程序就会等待,直到进程池中有可用进程为止. 进程池中有两个方法: apply a ...

  5. **CI中使用IN查询(where_in)

    注意别漏了$this->db->get(); /** * 匹配用户手机号,返回匹配的用户列表 * @param $column_str 'user_id, user_name, user_ ...

  6. Retrofit + RxJava + OkHttp 让网络请求变的简单-基础篇

    https://www.jianshu.com/p/5bc866b9cbb9 最近因为手头上的工作做完了,比较闲,想着做一些优化.看到以前用的那一套网络框架添加一个请求比较麻烦,并且比较难用,所以想改 ...

  7. JS倒计时、计时

    倒计时 倒计时常用于发送验证码 前端代码如下: <!DOCTYPE html> <html> <head> <title>倒计时.计时</titl ...

  8. 【LOJ】#2289. 「THUWC 2017」在美妙的数学王国中畅游

    题解 我们发现,题目告诉我们这个东西就是一个lct 首先,如果只有3,问题就非常简单了,我们算出所有a的总和,所有b的总和就好了 要是1和2也是多项式就好了--其实可以!也就是下面泰勒展开的用处,我们 ...

  9. 【AtCoder】ARC096(C - F)

    听说日本题思维都很棒,去涨涨智商qwq C - Half and Half 题解 枚举买多少个AB披萨也行 但是关于买x个AB披萨最后的总花费是个单峰函数,可以三分 这题有点像六省联考2017D1T1 ...

  10. 因为修改linux selinux修改错误产生的问题及解决办法

    会出现这个错误: not syncing attempted to kill init 解决办法是: 开机后一直按e 然后按这个修改: https://www.deep-silver.com/kern ...