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

本文共 1799 字,大约阅读时间需要 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();
            
}
       
}

转载于:https://www.cnblogs.com/zeroone/p/3640305.html

你可能感兴趣的文章
JAVA多线程之volatile 与 synchronized 的比较
查看>>
Java集合框架知识梳理
查看>>
笔试题(一)—— java基础
查看>>
Redis学习笔记(三)—— 使用redis客户端连接windows和linux下的redis并解决无法连接redis的问题
查看>>
Intellij IDEA使用(一)—— 安装Intellij IDEA(ideaIU-2017.2.3)并完成Intellij IDEA的简单配置
查看>>
Intellij IDEA使用(二)—— 在Intellij IDEA中配置JDK(SDK)
查看>>
Intellij IDEA使用(三)——在Intellij IDEA中配置Tomcat服务器
查看>>
Intellij IDEA使用(四)—— 使用Intellij IDEA创建静态的web(HTML)项目
查看>>
Intellij IDEA使用(五)—— Intellij IDEA在使用中的一些其他常用功能或常用配置收集
查看>>
Intellij IDEA使用(六)—— 使用Intellij IDEA创建Java项目并配置jar包
查看>>
Eclipse使用(十)—— 使用Eclipse创建简单的Maven Java项目
查看>>
Eclipse使用(十一)—— 使用Eclipse创建简单的Maven JavaWeb项目
查看>>
Intellij IDEA使用(十三)—— 在Intellij IDEA中配置Maven
查看>>
面试题 —— 关于main方法的十个面试题
查看>>
集成测试(一)—— 使用PHP页面请求Spring项目的Java接口数据
查看>>
使用Maven构建的简单的单模块SSM项目
查看>>
Intellij IDEA使用(十四)—— 在IDEA中创建包(package)的问题
查看>>
FastDFS集群架构配置搭建(转载)
查看>>
HTM+CSS实现立方体图片旋转展示效果
查看>>
FFmpeg 命令操作音视频
查看>>