WinForm中Application.Idle方法详解

Application.Idle()方法表示:当应用程序处于空闲状态时执行相应代码。

示例程序

1、界面设计:一个简单的Lable控件

2、代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;

namespace ApplicationIdleDemo
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public System.Timers.Timer timer;
        private void Form1_Load(object sender, EventArgs e)
        {
            InitTimer();
            InitRefresh();
            Refresh();
        }

        /// <summary>
        /// 初始化Timer控件
        /// </summary>
        private void InitTimer()
        {
            timer = new System.Timers.Timer(120000);
            //到达定时时间的时候执行的事件
            timer.Elapsed += new System.Timers.ElapsedEventHandler(TimeUp);
            //设置是执行一次(false) 还是一直执行(true)
            timer.AutoReset = true;
            //是否执行System.Timers.Timer.Elapsed事件
            timer.Enabled = true;
            //启动
            timer.Start();

        }

        /// <summary>
        /// 定时到点执行的事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        public void TimeUp(object sender, System.Timers.ElapsedEventArgs e)
        {
            Refresh();
        }

        private void Refresh()
        {
            this.lbl_idle.Text = "进入空闲期";
            string strPath = Application.StartupPath + @"test.txt";
            using (StreamWriter sw = new StreamWriter(strPath, true))
            {
                sw.WriteLine("开始进入空闲期,当前时间:" + DateTime.Now);
                sw.Close();
            }
        }

        private void InitRefresh()
        {
            //设定IDLE自动结束
            Application.Idle += new EventHandler(OnApplicationIdle);
            //设定消息过滤
            FormMessageFilter MessageFilter = new FormMessageFilter();
            MessageFilter.ApplicationActive += new EventHandler(OnApplicationActive);
            Application.AddMessageFilter(MessageFilter);

        }

        /// <summary>
        /// 程序进入空闲时期时会一直执行此事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void OnApplicationIdle(object sender, EventArgs e)
        {
            if (timer != null)
                timer.Start();
        }

        /// <summary>
        /// 当键盘及鼠标事件,关闭timer
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void OnApplicationActive(object sender, EventArgs e)
        {
            if (timer != null)
            {
                timer.Stop();
                EndIdle();
            }

        }

        private void EndIdle()
        {
            this.lbl_idle.Text = "结束空闲期,进入活动期";
            string strPath = Application.StartupPath + @"test.txt";
            using (StreamWriter sw = new StreamWriter(strPath,true))
            {
                sw.WriteLine("开始进入活动期,当前时间:" + DateTime.Now);
                sw.Close();
            }

        }

    }

    public class FormMessageFilter : IMessageFilter
    {
        public event EventHandler ApplicationActive;

        /// <summary>
        /// 只要是按键盘及鼠标便会引发事件
        /// 因为是为了监视键盘及鼠标,所以均return false;
        /// return ture:会把输入的值清除
        /// 0x100 /* WM_KEYDOWN
        /// 0x101 /* WM_KEYUP
        /// 0x200 /* WM_MOUSEMOVE
        /// 0x201 /* WM_LBUTTONDOWN
        /// 0x202 /* WM_LBUTTONUP
        /// 0x203 /* WM_LBUTTONDBLCLK
        /// 0x204 /* WM_RBUTTONDOWN
        /// 0x205 /* WM_RBUTTONUP
        /// 0x206 /* WM_RBUTTONDBLCLK
        /// 0x20a /* WM_MOUSEWHEEL
        /// </summary>
        public bool PreFilterMessage(ref Message m)
        {
            if (m.Msg == 0x100 || m.Msg == 0x101 || (m.Msg > 0x199 && m.Msg < 0x207) || m.Msg == 0x20a)
            {
                if (ApplicationActive != null)
                {
                    ApplicationActive(this, new EventArgs());
                }
            }
            return false;
        }
    }
}

到此这篇关于WinForm中Application.Idle方法的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 基于C#的winform实现数字华容道游戏

    数字华容道游戏类似于拼图游戏,只需将数字1~15按顺序排好即可.该游戏逻辑比较简单,易于编程实现. 游戏界面如图: 编程准备: 所需控件:label 用于显示时间, 一个重新开始的button,一个panel容器来存放数字块(按钮),再加一个timer来计时及判断游戏是否结束. 主要代码: variables类: class variables     {         public static int[] a = new int[16] { 1, 2, 3, 4, 5, 6, 7, 8,

  • C#开发Winform控件之打开文件对话框OpenFileDialog类

    OpenFileDialog类提供了用户打开文件的功能,它有如下属性: 属性 InitialDirectory:设置对话框的初始目录. Filter: 要在对话框中显示的文件筛选器,例如,"文本文件(*.txt)|*.txt|所有文件(*.*)||*.*". FilterIndex: 在对话框中选择的文件筛选器的索引,如果选第一项就设为1. RestoreDirectory: 控制对话框在关闭之前是否恢复当前目录. FileName:第一个在对话框中显示的文件或最后一个选取的文件. T

  • Winform项目中TextBox控件DataBindings属性

    DataBindings属性是很多控件都有的属性,作用有2方面.一方面是用于与数据库的数据进行绑定,进行数据显示.另一方面用于与控件或类的对象进行数据绑定.这里主要关注后者.主要用法是将某个对象的某个属性与指定对象的指定属性进行关联. Label.TextBox等都包含DataBindings属性,其类型为ControlBindingsCollection,是Binding类的集合.Binding类代表某对象属性值和某控件属性值之间的简单绑定.如可以将TextBox的Text属性值绑定到Labe

  • C#基于WinForm实现串口通讯

    串口通讯是一种计算机常用的数据传输方式. 程序运行如下: 首先,检查计算机的串口,并获取所有串口信息. private void CheckPort()//检查串口是否可用         {             myLog(2, "检测串口开始!");  //log记录函数             comboBox1.Items.Clear();//清除控件中的当前值                      string[] a = SerialPort.GetPortName

  • C# winForm自定义弹出页面效果

    本文实例为大家分享了C# winForm自定义弹出页面效果的具体代码,供大家参考,具体内容如下 在C#的windows窗体应用程序中,添加弹出框效果.最后就是这样的效果. 页面Form2上有2个文本框,textBox1和textBox2.点击任意一个文本框,根据准备好的数据,弹出Form1.其中Form1中的button个数是根据准备好的数据生成的.并且Form1的弹出位置,应该是文本框上面.最后,点击任意一个按钮,会将按钮上的值,显示到对应的文本框中,然后弹出页面关闭. 两个文本框显示的数据效

  • WinForm使用DataGridView实现类似Excel表格的查找替换功能

    在桌面程序开发过程中我们常常使用DataGridView作为数据展示的表格,在表格中我们可能要对数据进行查找或者替换. 其实要实现这个查找替换的功能并不难,记录下实现过程,不一定是最好的方式,但它有用! 先看demo下效果 1.数据展示建一个WinForm窗体 GridDataWindow ,放上菜单和DataGridView控件,添加4列用来显示信息. 创建一个Person类用于显示数据 public class Person { public int ID { get; set; } pub

  • C#实现Winform小数字键盘模拟器

    目录 一.构建计算器的界面 二.构建控件的开放属性 三.控件键盘输入 四.让文本框处理焦点状态以及光标位置的处理 五.实现退格.清除内容的功能 六.实现Enter确认得到结果的功能 文章开始之前,先看一下效果图,看是不是您正所需要的: 一.构建计算器的界面 要构建出一个好看点的计算器界面,还是需要颇费些小心思的,我做这个的时候,也花了两三个小时的时间构建这个界面. 其主要的使用控制是TableLayoutPanel控件. 另外一个小难点则在于内容控件Textbox的显示,要让文字垂直居中,在没有

  • WinForm中Application.Idle方法详解

    Application.Idle()方法表示:当应用程序处于空闲状态时执行相应代码. 示例程序 1.界面设计:一个简单的Lable控件 2.代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threadin

  • Angular中的$watch方法详解

    在$apply方法中提到过脏检查,首先apply方法会触发evel方法,当evel方法解析成功后,会去触发digest方法,digest方法会触发watch方法. (1)$watch简介 在digest执行时,如果watch观察的的value与上一次执行时不一样时,就会被触发. AngularJS内部的watch实现了页面随model的及时更新. $watch方法在用的时候主要是手动的监听一个对象,但对象发生变化时触发某个事件. (2)watch方法用法 $watch(watchFn,watch

  • angularjs中的$eval方法详解

    在controller中定义了一个变量 $scope.a_1 = "abc"; 想在view里面动态输出,因为这个数字是动态的,这么输出肯定是不行的{{'a_' + '1'}},因为输出来的是a_1这个字符串,而不是a_1这个变量的值 想输出a_1这个变量的值,可以使用$eval方法:{{$eval('a_' + '1')}} $eval是作为scope的方法来使用的,在controller中使用的话,是这么使用:$scope.$eval() 以上这篇angularjs中的$eval方

  • Python中格式化format()方法详解

     Python中格式化format()方法详解 Python中格式化输出字符串使用format()函数, 字符串即类, 可以使用方法; Python是完全面向对象的语言, 任何东西都是对象; 字符串的参数使用{NUM}进行表示,0, 表示第一个参数,1, 表示第二个参数, 以后顺次递加; 使用":", 指定代表元素需要的操作, 如":.3"小数点三位, ":8"占8个字符空间等; 还可以添加特定的字母, 如: 'b' - 二进制. 将数字以2为基

  • Android中SQLite 使用方法详解

    Android中SQLite 使用方法详解 现在的主流移动设备像android.iPhone等都使用SQLite作为复杂数据的存储引擎,在我们为移动设备开发应用程序时,也许就要使用到SQLite来存储我们大量的数据,所以我们就需要掌握移动设备上的SQLite开发技巧.对于Android平台来说,系统内置了丰富的API来供开发人员操作SQLite,我们可以轻松的完成对数据的存取. 下面就向大家介绍一下SQLite常用的操作方法,为了方便,我将代码写在了Activity的onCreate中: @Ov

  • Android 中 onSaveInstanceState()使用方法详解

    Android 中 onSaveInstanceState()使用方法详解 覆盖onSaveInstanceState方法,并在onCreate中检测savedInstanceState和获取保存的值 @Override protected void onSaveInstanceState(Bundle outState) { outState.putInt("currentposition", videoView.getCurrentPosition()); super.onSave

  • 关于redux-saga中take使用方法详解

    本文介绍了关于redux-saga中take使用方法详解,分享给大家,具体如下: 带来一个自己研究好久的API使用方法. redux-saga中effect中take这个API使用方式,用的多的是call,put,select,但take这个平常还真没什么机会用上,也不清楚在哪里使用才好,不管怎么样,既然是redux-saga写出来的,肯定是有他的用法的,不管37 21,先学会使用方法再说. 先看看介绍: take take的表现同takeEvery一样,都是监听某个action,但与takeE

  • Hybris在idea中debug配置方法详解

    1.启动hybris服务的命令用 hybrisserver.bat debug 2.在idea中配置remote debug 端口号默认不变选择所要监听的服务(如下图) 点击小爬虫启动debug服务访问接口时,即可用debug调试程序了! 总结 到此这篇关于Hybris在idea中debug配置方法详解的文章就介绍到这了,更多相关Hybris在idea中debug配置内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

  • java9在interface中定义私有方法详解

    一.Java 9接口定义私有方法 从Java 9开始,我们可以在Interface接口中添加private的私有方法和私有静态方法.这些私有方法将改善接口内部的代码可重用性.例如,如果需要两个默认方法来共享代码,则私有接口方法将允许它们共享代码,但不将该私有方法暴露给它的实现类调用(后文中会给大家举一个例子). 在接口中使用私有方法有四个规则: 接口中private方法不能是abstract抽象方法.因为abstract抽象方法是公开的用于给接口实现类实现的方法,所以不能是private. 接口

  • Python3.9.1中使用match方法详解

    接触编程的朋友都听过正则表达式,在python中叫re模块,属于文字处理服务里面的一个模块.re里面有一个方法叫match,接下来的文章我来详细讲解一下match. 作为新手,我建议多使用帮助文档,也就是help(re),来获取对re的说明.也可以尝试打开模块对应的py文件,细致地了解实现方法. 当然那是后话,饭得一口一口吃. 本文的主角是match,match的作用主要是从字符串起始位置匹配一个模式,如果成功则返回一个对象,失败则为None. 而match的语法是这样:match(patter

随机推荐