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; } = ;
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.的更多相关文章
- C# monitor keyboard and print pressed key
using System; using System.Windows.Forms; using System.Runtime.InteropServices; using System.Diagnos ...
- VNC ( Virtual Network Computing )
VNC is used to display an X windows session running on another computer. Unlike a remote X connectio ...
- run a Freight robot (2)
3. Network Setup Connecting Freight to a Monitor The easiest way to configure the wireless networki ...
- windows API 第22篇 WTSGetActiveConsoleSessionId
函数原型:DWORD WTSGetActiveConsoleSessionId (VOID)先看一下原文介绍: The WTSGetActiveConsoleSessionId function re ...
- jetson nano开发使用的基础详细分享
前言: 最近拿到一块jetson nano 2GB版本的板子,折腾了一下,从烧录镜像.修改配件等,准备一篇开箱基础文章给大家介绍一下这块AI开发板. 作者:良知犹存 转载授权以及围观:欢迎关注微信公众 ...
- 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 ...
- Javascript Madness: Mouse Events
http://unixpapa.com/js/mouse.html Javascript Madness: Mouse Events Jan WolterAug 12, 2011 Note: I ha ...
- java 并发官方教程
http://docs.oracle.com/javase/tutorial/essential/concurrency/index.html Concurrency Computer users t ...
- usb.ids
# # List of USB ID's # # Maintained by Vojtech Pavlik <vojtech@suse.cz> # If you have any new ...
随机推荐
- 按照相应的格式获取系统时间并将其转化为SQL中匹配的(date)时间格式
在获取时间时需要对时间格式进行设置,此时就需要用到SimpleDateFormat 类 SimpleDateFormat df = new SimpleDateFormat("yyyy-MM ...
- nginx的进程结构
nginx分为单进程和多进程,默认是多进程 进程架构: 父进程master process 子进程worker process和cache manager cache loader 高可用性 高可靠 ...
- 《 Java 编程思想》CH05 初始化与清理
< Java 编程思想>CH05 初始化与清理 用构造器确保初始化 在 Java 中,通过提供构造器,类的设计者可确保每个对象都会得到初始化.Java 会保证初始化的进行.构造器采用与类相 ...
- c/c++判断文件是否存在
#define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <fstream> #include <cstd ...
- Grevl旅游注册的初步界面,以源代码和运行图片展示
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- ERP入门到精通
大家好,最近有空就跟大家分享开发ERP经验,希望对大家有所帮助. 少说废话,直接进入主题吧. ERP定义:企业资源计划 企业资源:物资资源,人力资料,财务资源,信息资源 包含内容:制造,会计,财务,销 ...
- Codeforces_731_F
http://codeforces.com/problemset/problem/731/F 其实是暴力枚举,但是有些小技巧,直接保存每个数的数量. 枚举每个起点时,然后依次加上起点大小的分段的数量的 ...
- GitBook安装部署实操手册
前言 GitBook是一个基于Node.js的命令行工具,可使用Git和Markdown来编写文档,赞誉太多,不再赘述. Node.js 下载安装包 cd /tmp wget https://node ...
- php curl 检测网页是否被百度收录
<?php /* * 检测百度是否收录网页 curl模式 * @ param string $url传入的url* return int (1 收录 0 不收录) */ function che ...
- 2019IT运维大会上海站 智和信通解析等保2.0支撑
2019IT运维大会上海站 智和信通解析等保2.0支撑 2019年11月14日上午8:30-12:10,上海锦荣国际大酒店二层锦荣厅