企业应用中,经常会遇到一些需要定时自动执行的程序来完成某些功能,比如:自动定时从第三方web service取回数据、定时对历史数据进行清理、定时向ftp上传业务数据...

这类程序,我习惯称为“机器人”程序,就象机器一样机械、高效、重复的执行某些任务。通常部署上线后,都是放在服务器上一直开着,不允许轻易被关闭,而且最好要有一个界面,随时可以手动方便控制状态或查看运行情况,一旦发生异常情况,能及时通知管理员(Email或短信之类)
如果是采用WPF技术开发,以下是几个需要注意的地方:

1、无边框窗体(防止用户不小心点到 右上角的关闭按钮)

<Window x:Class="WeatherSpider.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"WindowStyle="None" ...>

将主窗体的WindowStyle设置成None即可

2、无边框窗体的移动
去掉顶上的边框后,通常为了美观,我们需要自己在顶上放一个伪造的标题栏,类似下面这样

<Border Grid.Row="0" MouseLeftButtonDown="TitleBarOnMouseLeftButtonDown" ><Grid Margin="5,5,5,0" ><Grid.ColumnDefinitions><ColumnDefinition Width="*"></ColumnDefinition><ColumnDefinition Width="Auto"></ColumnDefinition></Grid.ColumnDefinitions><TextBlock Foreground="GreenYellow" FontSize="16" x:Name="tbTitle">全国机场天气-采集机器人</TextBlock><TextBlock Text="最小化" Grid.Column="1" Foreground="GreenYellow" FontSize="12" VerticalAlignment="Center" TextAlignment="Right" x:Name="btnMin" Cursor="Hand" MouseLeftButtonDown="btnMin_MouseLeftButtonDown"></TextBlock></Grid>
</Border>

为了实现鼠标拖动标题栏时,窗体也能跟着拖动,需要在标题栏的对象上增加MouseLeftButtonDown事件处理(即:上面代码Border上的MouseLeftButtonDown="TitleBarOnMouseLeftButtonDown" )

private void TitleBarOnMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{base.DragMove();
}

哦,原来 so easy !

3.最小化到系统托盘
Winform中的NotifyIcon控件在WPF中仍然可以继续使用
先 using System.Windows.Forms; 添加Windows.Forms命名空间的引用
再声明一个窗体级的变量

private readonly NotifyIcon notifyIcon;

最后在主窗体的构架函数中,加入下列这一段

notifyIcon = new NotifyIcon();
notifyIcon.BalloonTipText = Properties.Resources.AppTitle + " 正在运行!";
notifyIcon.Text = Properties.Resources.AppTitle;//指定托盘提示文字为资源中的AppTitle字符串
notifyIcon.Icon = Properties.Resources.App;//指定托盘图标为资源中的"App"图标
notifyIcon.Visible = false;
notifyIcon.MouseClick += notifyIcon_MouseClick;//托盘右键菜单
MenuItem itemShowMainForm = new MenuItem("显示主界面");
itemShowMainForm.Click += ShowMainWindow;
MenuItem itemExit = new MenuItem("退出");
itemExit.Click += ExitApplication;
MenuItem[] menuItems = new[] { itemShowMainForm, itemExit };
notifyIcon.ContextMenu = new ContextMenu(menuItems);

notifyIcon_MouseClick事件代码如下:

public void Show() {Visibility = Visibility.Visible;Activate();notifyIcon.Visible = false;
}/// <summary>/// 托盘图标鼠标点击处理/// </summary>/// <param name="sender"></param>/// <param name="e"></param>
void notifyIcon_MouseClick(object sender, MouseEventArgs e)
{if (e.Button == MouseButtons.Left){if (Visibility == Visibility.Visible){Visibility = Visibility.Hidden;notifyIcon.Visible = true;}else{Show();}}
}//显示主界面
void ShowMainWindow(object sender, EventArgs e)
{Show();
}

在上面提到的第2点中,可能已经有朋友注意到了“最小化”的文本上,已经加了 MouseLeftButtonDown="btnMin_MouseLeftButtonDown"事件处理,即点击“最小化”这几个字,可以缩小到托盘区,代码如下:

private void btnMin_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{Visibility = Visibility.Hidden;//隐藏主窗体notifyIcon.Visible = true;//显示托盘图标notifyIcon.ShowBalloonTip(1000);//显示托盘图标上的气泡提示1秒钟
}

4.程序退出时,主动提醒
虽然做了无边框窗体的处理,但是如果用户意外按了Alt+F4,甚至误操作注销或重启Windows,程序还是会直接退出的,最好能给个提示,这样管理员看到提示后,有机会取消误操作
先给主窗体增加Closing事件处理,主窗体构造函数中,加入下面这一行

Closing += Window_Closing;

Window_Closing事件如下:

private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{if (MessageBox.Show("确定要退出[" + Properties.Resources.AppTitle + "]吗?",Properties.Resources.AppTitle,MessageBoxButton.YesNo,MessageBoxImage.Question,MessageBoxResult.No) == MessageBoxResult.Yes){                this.Closing -= Window_Closing;//注意:这里要注销事件监听,否则会连续弹出二次提示框才能退出notifyIcon.Visible = false;e.Cancel = false;}else{e.Cancel = true;}
}

经过上述处理后,用户按Alt+F4时,就会提示是否退出。但这样还不够,如果Windows注销时,仍然会直接退出
这就需要 using Microsoft.Win32;使用Win32命名空间下的某些功能了,主窗体构造函数中,增加:

//捕获关机事件
SystemEvents.SessionEnding += SystemEvents_SessionEnding;

处理代码如下:

void SystemEvents_SessionEnding(object sender, SessionEndingEventArgs e)
{if (MessageBox.Show("[" + Properties.Resources.AppTitle + "]正在运行中,确定要退出吗?",Properties.Resources.AppTitle,MessageBoxButton.YesNo,MessageBoxImage.Question,MessageBoxResult.No) == MessageBoxResult.Yes){e.Cancel = false;                }else {e.Cancel = true;}
}

同时在刚才的Window_Closing中,增加一行代码:(见下面的注释行)

private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{if (MessageBox.Show("确定要退出[" + Properties.Resources.AppTitle + "]吗?",Properties.Resources.AppTitle,MessageBoxButton.YesNo,MessageBoxImage.Question,MessageBoxResult.No) == MessageBoxResult.Yes){SystemEvents.SessionEnding -= SystemEvents_SessionEnding; //取消关机事件监听this.Closing -= Window_Closing;notifyIcon.Visible = false;e.Cancel = false;}else{e.Cancel = true;}
}

5.单实例运行
Winform中要实现单实例运行,非常容易(见 利用c#制作托盘程序,并禁止多个应用实例运行),但是WPF中就有点麻烦,网上搜索了一下,有朋友已经解决了这个问题
引用using Microsoft.VisualBasic.ApplicationServices; (注:必须先添加对Microsoft.VisualBasic的程序集引用)
然后把App.xaml编译属性改成Page,同时修改App.xaml.cs代码如下:

using System.Windows;
using System.Diagnostics;
using System;
using WeatherSpider.Helper;namespace WeatherSpider
{/// <summary>/// Interaction logic for App.xaml/// </summary>public partial class App : Application{/// <summary>/// Application Entry Point./// </summary>[STAThread][DebuggerNonUserCode]        public static void Main(string[] a){SingleApp app = new SingleApp();//SingleApp类后面马上会提到app.Run(a);}protected override void OnStartup(StartupEventArgs e){base.OnStartup(e);MainWindow w = new MainWindow();w.Show();//即调用主窗体中的Show方法,显示主窗体}public void Activate(){(MainWindow as MainWindow).Show();        }}
}

再创建一个SingleApp类

using Microsoft.VisualBasic.ApplicationServices;namespace WeatherSpider.Helper
{public class SingleApp : WindowsFormsApplicationBase{App a;public SingleApp(){this.IsSingleInstance = true;}protected override bool OnStartup(StartupEventArgs eventArgs){a = new App();           a.Run();return false;}protected override void OnStartupNextInstance(StartupNextInstanceEventArgs eventArgs){base.OnStartupNextInstance(eventArgs);a.Activate();//第二个实例试图“启动”时,自动把已经运行的实例激活并显示}}}

最后上图二张:

WPF:自动执行机器人程序若干注意事项相关推荐

  1. DELMIA软件弧焊仿真:以工件边缘曲线为焊缝的机器人程序自动生成

    目录 功能介绍 弧焊焊接焊点坐标创建 弧焊焊点坐标姿态批量调整 机器人弧焊焊接程序自动生成 弧焊焊接机器人仿真运行 本文已经首发在个人微信公众号:工业机器人仿真与编程(微信号:IndRobSim),欢 ...

  2. Linux中使用计划任务自动执行

    Linux中的计划任务 知识要点 计划任务的意义 计划任务分类 用户计划任务crontab 系统计划任务 计划任务使用注意事项 anacron服务介绍 计划任务的意义 1.计划任务 创建和管理在指 ...

  3. bigquery使用教程_如何使用Python和Google BigQuery构建机器人以自动执行您的笨拙任务...

    bigquery使用教程 Do you have repetitive tasks? Something that you do regularly, every week or even every ...

  4. 法拉克机器人自动怎么调_FANUC机器人程序自动启动介绍汇总.ppt

    FANUC机器人程序自动启动介绍汇总 程序启动条件及时序介绍 上海发那科机器人有限公司 2012.9.20 自动运行方式的定义 第一部分 程序启动类型 所需启动的机器人程序可以使用外部控制设备如PLC ...

  5. 机器人搬运礼盒程序_自动搬运机器人源程序

    i_2=55;i_2&gt=0;i_2--) { SetServo(0,0,2,i_2); SetServo(0,1,1,i_2); } for(i_2=0;i_2&lt90;i_2+ ...

  6. mbot机器人自动超声波模式程序_利用mBot智能机器人使用超声波传感器解决问题...

    一.观察图片,分析原理 教师引导学生分析(如图1):汽车在倒车过程中是如何判断出后方有障碍物的?这是根据什么原理实现的? 师生分析得出结论:汽车的尾部安装了倒车雷达,可以判断汽车与障碍物的距离,而倒车 ...

  7. 如何让asp.net应用程序定时自动执行代码

    asp.net程序一般是当用户请求一个Page,或者请求一个WebService的时候,才会执行一段代码,如果我们希望让程序定时自动执行代码,但是又不增加新的应用程序,应该怎么做呢? 首先,给你的we ...

  8. 对程序实施精准手术!阿里安全猎户座实验室首创“自动逆向机器人”

    近日举办的看雪安全开发者峰会上,阿里安全猎户座实验室首度向外界展示了最新的研究成果--"自动逆向机器人".该机器人可以像医生一样"望闻问切",对程序进行显微镜级 ...

  9. windows制作定时关机脚本_自动关机、自动打开程序… 让Windows自动执行任何操作...

    文章转载于网络,侵删 Windows 中有一个非常棒的功能,叫做"任务计划程序",但是因为它的界面看起来有点复杂,导致很少有人使用它. 其实对于任何人而言,"任务计划程序 ...

最新文章

  1. 父进程等待子进程结束
  2. 《图解机器学习-杉山将著》读书笔记---CH1
  3. 转Java工程师成神之路
  4. 用C语言写一个球的程序,12个球的程序.....
  5. 电脑常见故障处理_彩超常见故障及维修
  6. python-列表list和元组tuple
  7. VMware vCenter Server6.5安装及群集配置介绍
  8. python 苹果id申请_如何申请百度机器翻译API的ID和Key,为Python调用做准备
  9. 读《编程珠玑》 (四)
  10. pytorch从dataframe中提取信息,变为可训练的tensor
  11. 传统接口写法与Restful API 区别
  12. 开机没有自检声,显示器无信号及各版本BIOS报警信号大全 转
  13. Linux系统安全保护措施
  14. vscode中的中文乱码问题
  15. 链路聚合_链路聚合的配置命令
  16. e3 v3服务器芯片组,E3 V5专用主板特别在哪?华硕E3 PRO GAMING评测-太平洋电脑网
  17. java和android!怒斩获了30家互联网公司offer,分享PDF高清版
  18. python医院排队系统_叫号系统排队系统挂号系统实现(JAVA队列)
  19. c语言record的作用,C语言基础 record 2-指针,结构体,链表,文件的输入输出
  20. c语言结构体详解(struct)

热门文章

  1. aida64副屏监控_“遥信”在电力监控系统中的重要作用
  2. 7-6 统计字符串中数字字符的个数_洛谷 || 标题统计(C语言)
  3. Spring-boot注入配置为java静态属性
  4. Spring data redis乱码问题
  5. Docker Compose安装
  6. 李兴华html css,2014MLDN(李兴华老师视频教程)
  7. UIView常用的一些方法小记之setNeedsDisplay和setNeedsLayout
  8. 读取raw目录中的文件数据
  9. VS2012/13本地发布网站详细步骤(可带数据库)
  10. 极限中0除以常数_高中物理必知的50个关键常数, 每个都是得分点!