记录|如何全局监听鼠标和键盘等事件

13 篇文章 0 订阅
10 篇文章 1 订阅


前言

参考文章:
C# winfrom 长时间检查不到操作,自动关闭应用程序

本来是想,如果一段时间没有操作软件,这个软件就自动退出的任务。但是在C#中,采用winform后,有很大的困难。表现为:

  • 监听困难,理论上是只要进行Form监听就可以了,但是实际上Form上面有许多的Panel和Button等控件在上面进行监听,所以如果要写鼠标、按钮等监听事件,会导致要N多个控件的重复性写法。
  • 一查找这种全局监听的,很多CSDN中都采用HOOK钩子的写法。而这种写法一则我没用过,二则会和系统抢资源,属于影响性能的一种方法。

后来,看了上面的文章后,自己进行了实验,发现这种方法确实可行。现在将复刻后的代码公布如下:


一、MyMessager类

这里创建个MyMessager类,对Messager信息进行监听。【类的代码如下:】

  • iOperCount,创建为public类,是为了调用的时候来进行运行时间判断。
namespace ZHCH_winform_2.manager
{
    internal class MyMessager : IMessageFilter
    {
        public int iOperCount { get; set; }

        public bool PreFilterMessage(ref Message m)
        {
            // 如果检测到有鼠标或则键盘的消息,则使计数为0
            if(m.Msg==0x0200 || m.Msg==0x0201 || m.Msg==0x0204 || m.Msg == 0x0207)
            {
                iOperCount = 0;
            }
            return false;
        }
    }
}

二、Form中进行Timer监听

  • 初始化MyMessager类msg。
        private MyMessager msg = new MyMessager();
        //
        public FormMain()
        {
            InitializeComponent();
            this.KeyPreview = true; // 允许窗体接收按键事件
        }
  • 在Form类FormMain加载时,进行消息监听【采用了定时器Timer,命名为:timerMoniter】

        private void FormMain_Load(object sender, EventArgs e)
        {
            Application.AddMessageFilter(msg);
            timerMoniter.Start();
        }
  • 定时器中的监听事件如下:
        /// <summary>
        /// 全局监控鼠标、键盘等事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void timerMoniter_Tick(object sender, EventArgs e)
        {
            //如果计数=0,代表触发了按钮,鼠标等事件,那么就要重新计时。
            if (msg.iOperCount == 0)
            {
                ResetLogoutSeconds();
            }
            int iOperCount = msg.iOperCount++;
            // 如果计数超过了设定的最大时间,就退出登录
            if (iOperCount > this.MaxSeconds || logoutSeconds <= 0)
            {
                MessageBox.Show($"{this.MaxSeconds}已经到达");
                Application.Exit();
            }
            // 倒计时的循环
            if (logoutSeconds > 0)
            {
                this.progressLogout.Text = logoutSeconds.ToString() + " S";
                float progressValue = (float)(logoutSeconds / MaxSeconds);
                this.progressLogout.Value = progressValue;
                logoutSeconds--;
            }
        }
        /// <summary>
        /// 重写键盘读取事件
        /// </summary>
        /// <param name="e"></param>
        protected override void OnKeyDown(KeyEventArgs e)
        {
            ResetLogoutSeconds();
            //base.OnKeyDown(e);
        }
        /// <summary>
        /// 重置倒计时时间
        /// </summary>
        private void ResetLogoutSeconds()
        {
            logoutSeconds = 120;
            progressLogout.Text = logoutSeconds.ToString() + " S";
            this.progressLogout.Value = 1;
        }

更新时间

  • 2024.08.26:创建并复刻成功
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 中可以使用 AWT 和 Swing 提供的事件监听机制来实现全局监听键盘鼠标的功能。 监听键盘事件: ```java import java.awt.event.KeyEvent; import java.awt.event.KeyListener; public class KeyboardListener implements KeyListener { @Override public void keyPressed(KeyEvent e) { // 处理键盘按下事件 // e.getKeyCode() 可以获取按下的键的代码 } @Override public void keyReleased(KeyEvent e) { // 处理键盘释放事件 } @Override public void keyTyped(KeyEvent e) { // 处理键盘输入事件 } } ``` 全局监听键盘事件: ```java import java.awt.Toolkit; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; public class GlobalKeyboardListener implements KeyListener { public GlobalKeyboardListener() { Toolkit.getDefaultToolkit().addAWTEventListener(event -> { if (event instanceof KeyEvent) { KeyEvent keyEvent = (KeyEvent) event; // 处理键盘事件 } }, AWTEvent.KEY_EVENT_MASK); } @Override public void keyPressed(KeyEvent e) { // 处理键盘按下事件 // e.getKeyCode() 可以获取按下的键的代码 } @Override public void keyReleased(KeyEvent e) { // 处理键盘释放事件 } @Override public void keyTyped(KeyEvent e) { // 处理键盘输入事件 } } ``` 监听鼠标事件: ```java import java.awt.event.MouseEvent; import java.awt.event.MouseListener; public class MouseListener implements MouseListener { @Override public void mouseClicked(MouseEvent e) { // 处理鼠标点击事件 // e.getButton() 可以获取点击的鼠标按钮 } @Override public void mousePressed(MouseEvent e) { // 处理鼠标按下事件 } @Override public void mouseReleased(MouseEvent e) { // 处理鼠标释放事件 } @Override public void mouseEntered(MouseEvent e) { // 处理鼠标进入事件 } @Override public void mouseExited(MouseEvent e) { // 处理鼠标离开事件 } } ``` 全局监听鼠标事件: ```java import java.awt.Toolkit; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; public class GlobalMouseListener implements MouseListener { public GlobalMouseListener() { Toolkit.getDefaultToolkit().addAWTEventListener(event -> { if (event instanceof MouseEvent) { MouseEvent mouseEvent = (MouseEvent) event; // 处理鼠标事件 } }, AWTEvent.MOUSE_EVENT_MASK); } @Override public void mouseClicked(MouseEvent e) { // 处理鼠标点击事件 // e.getButton() 可以获取点击的鼠标按钮 } @Override public void mousePressed(MouseEvent e) { // 处理鼠标按下事件 } @Override public void mouseReleased(MouseEvent e) { // 处理鼠标释放事件 } @Override public void mouseEntered(MouseEvent e) { // 处理鼠标进入事件 } @Override public void mouseExited(MouseEvent e) { // 处理鼠标离开事件 } } ``` 注意:全局监听键盘鼠标事件需要在启动程序时添加,否则可能监听不到事件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值