博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
WinForm触摸屏程序功能界面长时间不操作自动关闭回到主界面 z
阅读量:7069 次
发布时间:2019-06-28

本文共 1748 字,大约阅读时间需要 5 分钟。

操作者经常会在执行了某操作后,没有返还主界面就结束了操作然后离开了,程序应该关闭功能窗体自动回到主界面方便下一位操作者操作。那么对于WinForm程序怎么实现呢?

实现原理:拦截Application响应操作系统发送到消息,如果是比如KeyDown、Mouse Move等输入设备相关的Message ID则表示程序是在有人操作的状态,反之则使用一个计数器累积到某值,也就是相当于多长时间无人操作则关闭功能界面回到主界面。使用 Application.AddMessageFilter方法添加消息的过滤机制。

IMessageFilter接口:消息筛选器接口。命名空间: System.Windows.Forms 程序集: System.Windows.Forms(在 system.windows.forms.dll 中)。AddMessageFilter方法传递的参数为实现IMessageFilter的一个类,那么必须实现PreFilterMessage方法,这就是实现消息筛选的方法。 代码实现:
using
System;
using
System.Collections.Generic;
using
System.Linq;
using
System.Text;
using
System.Windows.Forms;
 
namespace
WinFormApp
{
    
public
class
MyMessageFilter : IMessageFilter
    
{
        
public
int
iOperCount
        
{
            
get
;
            
set
;
        
}
 
        
#region IMessageFilter 成员
        
public
bool
PreFilterMessage(
ref
Message m)
        
{
            
//如果检测到有鼠标或则键盘的消息 可添加其他消息ID如触摸屏的点击事件ID
            
if
(m.Msg == (
int
)WindowsMessages.WM_KEYDOWN || m.Msg == 513 || m.Msg == 515 || m.Msg == 516 || m.Msg == 522
                
//|| m.Msg == (int)WindowsMessages.WM_MOUSEMOVE
                
//|| m.Msg == (int)WindowsMessages.WM_LBUTTONDOWN
                
//|| m.Msg == (int)WindowsMessages.WM_RBUTTONDOWN
                
|| m.Msg == (
int
)WindowsMessages.WM_MBUTTONDOWN
                
)
            
{
                
iOperCount = 0;
            
}
            
return
false
;
        
}
        
#endregion
    
}
}

 应用程序入口添加消息监控、过滤:

public
static
MyMessageFilter msgFilter =
new
MyMessageFilter();      
[STAThread]
static
void
Main()
 
{
      
Application.AddMessageFilter(msgFilter);
      
Application.Run(
new
frmMain());
 

 程序主界面开启一个定时器:

/// <summary>
        
/// 定时器设置为每10秒触发一次
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>
        
private
void
timer1_Tick(
object
sender, EventArgs e)
        
{
            
Program.msgFilter.iOperCount++;
            
if
(Program.msgFilter.iOperCount > CLOSE_TIME)
            
{
                
if
(Application.OpenForms.Count > 1)
                    
foreach
(Form mdiFrm
in
Application.OpenForms)
                        
if
(mdiFrm.Name.ToLower() !=
"frmmain"
)
                            
mdiFrm.Close();
            
}
       
}

转载地址:http://leqll.baihongyu.com/

你可能感兴趣的文章
知识思考
查看>>
OpenCV安装
查看>>
在一行上打印(完成度打印)
查看>>
linux运维人员常用的150个命令
查看>>
boost库 线程使用
查看>>
FPGA笔试必会知识点1--数字电路基本知识
查看>>
基于华为云区块链服务快速部署和搭建链上应用
查看>>
浏览器被hao.360.cn劫持怎么办
查看>>
bzoj3068: 小白树
查看>>
Dubbo学习总结(3)——Dubbo-Admin管理平台和Zookeeper注册中心的搭建
查看>>
每天一个linux命令(5):rm 命令
查看>>
浅谈HTTP中Get与Post的区别
查看>>
【汇编】1.汇编环境的搭建:DOSBox的安装
查看>>
requests 简单爬虫
查看>>
datatable&list<T>
查看>>
【Python3爬虫】selenium入门
查看>>
C语言语法
查看>>
Ruby判断文件是否存在
查看>>
Mongodb学习(安装篇): 在centos下的安装
查看>>
python "re" 模块
查看>>