• C# monitor keyboard and mouse actions based on MouseKeyHook.


    Below is applicable for ConsoleApplication

    1.Install-package MouseKeyHook

    2.

    using Gma.System.MouseKeyHook;
    using System; 
    
    namespace ConsoleApp1
    {
        public class MonitorHelper
        {
            public static void ListenForMouseEvents()
            {
                Hook.GlobalEvents().MouseClick += (sender, e) =>
                {
                    Console.WriteLine($"{DateTime.Now.ToString("yyyyMMddHHmmssffff")} Mouse {e.Button} clicked.");
                };
    
                Hook.GlobalEvents().MouseDoubleClick += (sender, e) =>
               {
                   Console.WriteLine($"{DateTime.Now.ToString("yyyyMMddHHmmssffff")} Mouse {e.Button} button double clicked.");
               };
    
                Hook.GlobalEvents().MouseDragFinished += (sender, e) =>
                {
                    Console.WriteLine($"{DateTime.Now.ToString("yyyyMMddHHmmssffff")} Mouse {e.Button} dragged");
                };
    
                Hook.GlobalEvents().MouseWheel += (sender, e) =>
                {
                    Console.WriteLine($"{DateTime.Now.ToString("yyyyMMddHHmmssffff")} Mouse scrolls");
                };
    
                Hook.GlobalEvents().KeyDown += (sender, e) =>
                {
                    Console.WriteLine($"{DateTime.Now.ToString("yyyyMMddHHmmssffff")} pressed {e.KeyCode}");
                };
            }
        }
    }

    3.

    static void Main(string[] args)
            {
                MouseMonitor();
                Console.ReadLine();
            }
    
            static void MouseMonitor()
            {
                MonitorHelper.ListenForMouseEvents();
                Application.Run(new ApplicationContext());
            }

    While in desktop application,such as WindowsForm.Please ignore above part and reference below.

     public class MonitorHelper
        {
            public static int ClickCount { get; set; } = 0;
            public static int DoubleClickCount { get; set; } = 0;
            public static int WheelCount { get; set; } = 0;
            public static int MoveCount { get; set; } = 0;
            public static int PressCount { get; set; } = 0;
            private static IKeyboardMouseEvents kmEvents;
            public static void ListenForMouseEvents()
            {
                kmEvents = Hook.GlobalEvents();
                kmEvents.MouseClick += MonitorHelperMouseClick;           
                kmEvents.MouseDoubleClick += MonitorHelperMouseDoubleClick;
                kmEvents.MouseDragFinished += MonitorHelperMouseDragFinished;
                kmEvents.MouseWheel += MonitorHelperMouseWheel;
                kmEvents.KeyDown += MonitorHelperKeyDown;            
            }
    
            private static void MonitorHelperKeyDown(object sender, KeyEventArgs e)
            {
                PressCount++;
            }
    
            private static void MonitorHelperMouseWheel(object sender, MouseEventArgs e)
            {
                WheelCount++;
            }
    
            private static void MonitorHelperMouseDragFinished(object sender, MouseEventArgs e)
            {
                MoveCount++;
            }
    
            private static void MonitorHelperMouseDoubleClick(object sender, MouseEventArgs e)
            {
                DoubleClickCount++;
            }
    
            private static void MonitorHelperMouseClick(object sender, MouseEventArgs e)
            {
                ClickCount++;
            }
    
            public static void MouseMonitor()
            {
                MonitorHelper.ListenForMouseEvents(); 
            }
        }

    There is a big problem in Windows Form when use the first part.It will report exception and bug like below.

      **CallbackOnCollectedDelegate was detected**
    
    A callback was made on a garbage collected delegate of type 'Browser!Utilities.globalKeyboardHook+keyboardHookProc::Invoke'. This may cause application crashes, corruption and data loss. When passing delegates to unmanaged code, they must be kept alive by the managed application until it is guaranteed that they will never be called.

    So we need to declare a new  variable and assign values to it.Then register events based on the new variable instead of the Hook.GlobalEvents.

     
    private static IKeyboardMouseEvents kmEvents; 
    kmEvents = Hook.GlobalEvents();
     
  • 相关阅读:
    53个Python面试问题
    ycsb对hbase性能测试的研究
    zookeeper的安装(图文详解。。。来点击哦!)
    Zookeeper概论(对zookeeper的概论、原理、架构等的理解)
    Hadoop集群搭建安装过程(三)(图文详解---尽情点击!!!)
    Hadoop集群搭建安装过程(二)(图文详解---尽情点击!!!)
    Hadoop集群搭建安装过程(一)(图文详解---尽情点击!!!)
    Linux虚拟机安装(CentOS 6.5,图文详解,需要自查)
    Hive中的排序和分组(对map和reduce的影响,值得一看!)
    HDFS的工作原理(读和写操作)
  • 原文地址:https://www.cnblogs.com/treeskyer/p/12749557.html
Copyright © 2020-2023  润新知