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; } = ;
public static int DoubleClickCount { get; set; } = ;
public static int WheelCount { get; set; } = ;
public static int MoveCount { get; set; } = ;
public static int PressCount { get; set; } = ;
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();
 

C# monitor keyboard and mouse actions based on MouseKeyHook.的更多相关文章

  1. C# monitor keyboard and print pressed key

    using System; using System.Windows.Forms; using System.Runtime.InteropServices; using System.Diagnos ...

  2. VNC ( Virtual Network Computing )

    VNC is used to display an X windows session running on another computer. Unlike a remote X connectio ...

  3. run a Freight robot (2)

    3.  Network Setup Connecting Freight to a Monitor The easiest way to configure the wireless networki ...

  4. windows API 第22篇 WTSGetActiveConsoleSessionId

    函数原型:DWORD WTSGetActiveConsoleSessionId (VOID)先看一下原文介绍: The WTSGetActiveConsoleSessionId function re ...

  5. jetson nano开发使用的基础详细分享

    前言: 最近拿到一块jetson nano 2GB版本的板子,折腾了一下,从烧录镜像.修改配件等,准备一篇开箱基础文章给大家介绍一下这块AI开发板. 作者:良知犹存 转载授权以及围观:欢迎关注微信公众 ...

  6. PatentTips - Scheduling compute kernel workgroups to heterogeneous processors based on historical processor execution times and utilizations

    BACKGROUND OF THE INVENTION  1. Field of the Invention  The present invention relates generally to h ...

  7. Javascript Madness: Mouse Events

    http://unixpapa.com/js/mouse.html Javascript Madness: Mouse Events Jan WolterAug 12, 2011 Note: I ha ...

  8. java 并发官方教程

    http://docs.oracle.com/javase/tutorial/essential/concurrency/index.html Concurrency Computer users t ...

  9. usb.ids

    # # List of USB ID's # # Maintained by Vojtech Pavlik <vojtech@suse.cz> # If you have any new ...

随机推荐

  1. SpringBoot学习(一):SpringBoot入门

    1.Spring Boot 简介 1) 简化Spring应用开发的一个框架: 2) 整个Spring技术栈的一个大整合: 3) J2EE开发的一站式解决方案: 2.微服务 2014,martin fo ...

  2. 释放innodb空间

    记一次MySQL运维 [root@b2btest ~]# free -h total used free shared buffers cached Mem: 125G 124G 780M 13M 2 ...

  3. Druid入门(1)—— 快速入门实时分析利器-Druid_0.17

    一.安装准备 本次安装的版本是截止2020.1.30最新的版本0.17.0 软件要求 需要Java 8(8u92 +)以上的版本,否则会有问题 Linux,Mac OS X或其他类似Unix的操作系统 ...

  4. 【存储类、链接、存储管理】分配内存:malloc()、free()

    一.使用库函数:malloc()分配管理内存 (一)标识符(Identifier) 1. 定义变量时,使用了诸如 a.abc.mn123 这样的名字,它们都是程序员自己起的,一般能够表达出变量的作用, ...

  5. kubernetes容器端口设置的坑

    1.使用dockerhub上面的镜像的时候,先到dockerhub上看镜像的相关信息. 2.不能随便修改容器应用的镜像,会出问题.

  6. 2、HotSpot虚拟机对象探秘

    基于使用优先的原则,以常用的虚拟机HotSpot和常用的内存区域Java堆为例,深入探讨HotSpot虚拟机在Java堆中对象分配.布局和访问的全过程. 1.对象的创建 划分可用空间 在语言层面上,创 ...

  7. 轻松搞懂Python递归函数的原理与应用

    递归: 在函数的定义中,函数内部的语句调用函数本身. 1.递归的原理 学习任何计算机语言过程中,“递归”一直是所有人心中的疼.不知你是否听过这个冷笑话:“一个面包,走着走着饿了,于是就把自己吃了”. ...

  8. 提升命令行效率的Bash快捷键

    转自:http://linuxtoy.org/archives/bash-shortcuts.html 生活在 Bash shell 中,熟记以下快捷键,将极大的提高你的命令行操作效率. 大部分对其他 ...

  9. 并发编程之Master-Worker模式

    我们知道,单个线程计算是串行的,只有等上一个任务结束之后,才能执行下一个任务,所以执行效率是比较低的. 那么,如果用多线程执行任务,就可以在单位时间内执行更多的任务,而Master-Worker就是多 ...

  10. javascript canvas全部API

    HTMLCanvasElement//canvas elem对象 属性 height//高 width//宽 方法 getContext()//获取<canvas>相关的可绘制的上下文 t ...