WinForm中Application.Idle方法详解

 更新时间:2022年03月01日 08:57:57   作者:.NET开发菜鸟  
本文详细讲解了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方法的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 详解WPF如何在Panel中实现设置所有子项间距

    详解WPF如何在Panel中实现设置所有子项间距

    这篇文章主要为大家详细介绍了WPF如何在Panel中实现设置所有子项间距,本文借鉴了 Qt 中的 Spacing 设置方法,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-10-10
  • C#实现的AES加密解密完整实例

    C#实现的AES加密解密完整实例

    这篇文章主要介绍了C#实现的AES加密解密,结合完整实例形式分析了C#实现的AES算法进行加密与解密的相关技巧,需要的朋友可以参考下
    2016-07-07
  • Unity实现俄罗斯方块(二)

    Unity实现俄罗斯方块(二)

    这篇文章主要为大家详细介绍了Unity实现俄罗斯方块的第一部分代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-06-06
  • C#实现创建,删除,查找,配置虚拟目录实例详解

    C#实现创建,删除,查找,配置虚拟目录实例详解

    这篇文章主要介绍了C#创建,删除,查找,配置虚拟目录的方法,以实例形式较为详细的分析了C#针对虚拟目录的创建、删除、查找等相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-08-08
  • C#编程获取实体类属性名和值的方法示例

    C#编程获取实体类属性名和值的方法示例

    这篇文章主要介绍了C#编程获取实体类属性名和值的方法,涉及C#实体类的定义、实例化、遍历等相关操作技巧,需要的朋友可以参考下
    2017-04-04
  • WPF实现带模糊搜索的DataGrid的示例代码

    WPF实现带模糊搜索的DataGrid的示例代码

    这篇文章主要为大家详细介绍了WPF如何实现带模糊搜索的DataGrid,文中的示例代码讲解详细,具有一定的借鉴价值,需要的可以参考一下
    2023-02-02
  • C# 解决在Dictionary中使用枚举的效率问题

    C# 解决在Dictionary中使用枚举的效率问题

    这篇文章主要介绍了C# 解决在Dictionary中使用枚举的效率问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • 浅析WPF中控件拖拽与拖动的实现

    浅析WPF中控件拖拽与拖动的实现

    这篇文章主要为大家详细介绍了如何在WPF中实现控件拖拽与拖动的功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-12-12
  • 用C#写的ADSL拨号程序的代码示例

    用C#写的ADSL拨号程序的代码示例

    用C#写的ADSL拨号程序的代码示例...
    2007-11-11
  • 在.NET WebService中跨域CORS问题的解决方案

    在.NET WebService中跨域CORS问题的解决方案

    在现代的Web应用程序开发中,跨域资源共享(Cross-Origin Resource Sharing, CORS)问题是开发者经常遇到的一个挑战,在这篇博客中,我们将深入探讨如何在 .NET WebService 中解决CORS问题,帮助开发者顺利实现跨域请求,需要的朋友可以参考下
    2024-05-05

最新评论