首页 > 其他分享 >简单实现.NET Hook与事件模拟

简单实现.NET Hook与事件模拟

时间:2023-10-27 11:15:14浏览次数:36  
标签:鼠标 hook timer Hook NET KeyCode 模拟 游戏

最近玩《星露谷物语》上瘾,本来是看着个休闲游戏,现在玩成修仙游戏了,上百个小时浑身是肝,中午午休习惯都强行给改了。

虽然挺有意思,但是太肝了,入坑前请谨慎。补充一下,这个游戏应该是基于 XNA/MonoGame 写的。

这个游戏在丧失焦点的时候会自动暂停,无法自动推进,我觉得效率太低了,为了齐先生的场子,我得搞一个自动点击的东西。

不想下载软件就自己写一个吧,因为要保证游戏始终在前面,那肯定开关需要启用全局快捷键。找了一下,. NET 有一个 SharpHook (tolik.io) 就挺简单的,花几分钟写了一个,实现了功能。

SharpHook 是一个跨平台的 Hook 组件,核心基于 libuiohook

监听事件

官网的文档非常简洁易懂,我设置快捷键监听,监听按键按下。

var hook = new TaskPoolGlobalHook();
hook.HookEnabled += OnHookEnabled;     // EventHandler<HookEventArgs>
hook.HookDisabled += OnHookDisabled;   // EventHandler<HookEventArgs>

hook.KeyTyped += OnKeyTyped;           // EventHandler<KeyboardHookEventArgs>

hook.Run();

然后在事件中设置定时器启动以及停止,我目标是每隔两秒钟按鼠标左键一次。

private static void OnKeyTyped(object? sender, KeyboardHookEventArgs e)
{
    if (e.SuppressEvent) return;
    if (e.Data.KeyCode.HasFlag(KeyCode.VcSemicolon)) // ;键
    {
        Console.WriteLine("start timer");
        _timer.Start();
    }
    else if (e.Data.KeyCode.HasFlag(KeyCode.VcL)) //L键
    {
        Console.WriteLine("stop timer");
        _timer.Stop();
    }
    e.SuppressEvent = true;
}

模拟事件

这个库同样可以模拟鼠标和键盘的操作,我这里操作鼠标,键盘也是同理。

static EventSimulator _simulator = new EventSimulator();
private static void _timer_Elapsed(object? sender, System.Timers.ElapsedEventArgs e)
{
	_simulator.SimulateMousePress(MouseButton.Button1);
	Thread.Sleep(100);
	_simulator.SimulateMouseRelease(MouseButton.Button1);
}

注意,很多游戏是单独监听鼠标的按下与松开的,这样算一次完整的点击,如果中间没有设置延时,有可能识别不鼠标的动作。这个游戏就是这样,没有延时就不行。

好了,运行之后放在后台,在游戏获取焦点的时候,按";"启动,然后鼠标悬停在物品上面就能自动拿起/放下了,按“L”退出。

image

键位与其他

参考 Key Code Mappings | SharpHook (tolik.io) 看键名称与 Key Code。调试的时候,如果在 OnKeyTyped 事件中设置断点会有一下子非常卡,耐心一点就正常了。

另外,我 Hook 上方 F 功能键的时候一直不成功,但是 ESC 是可以正常被响应的,没有深入去研究为什么,以后真完全有必要了再看看。

标签:鼠标,hook,timer,Hook,NET,KeyCode,模拟,游戏
From: https://www.cnblogs.com/podolski/p/17791537.html

相关文章

  • 「译文」深入了解Kubernetes和Nomad
    ......
  • Kubernetes 迁移节点 Kubelet 数据存储目录
    1、概述默认Kubernetes节点Kubelet数据目录在/var/lib/kubelet,如果在部署前没有做好规划,其实默认就存储在系统盘/分区下了,这可能会引发一些问题:磁盘空间限制:系统根目录通常具有较小的磁盘空间,用于操作系统文件和应用程序。将Kubelet数据与操作系统混合存储可能导致磁盘空......
  • 基于Googlenet深度学习网络的信号调制类型识别matlab仿真
    1.算法运行效果图预览   2.算法运行软件版本MATLAB2022a 3.算法理论概述      信号调制类型识别是在无线通信和无线电频谱监测中的一个重要任务。不同信号调制类型具有不同的频谱特征,深度学习方法在信号调制类型识别中取得了显著的成果。 3.1深度学习与......
  • 【模拟题】麒麟操作系统运维高级工程师KYCP(运维)
    【模拟题】麒麟操作系统运维高级工程师KYCP(运维)答题卡[单选题]1.(1分)team链路聚合最多支持几块网卡82.(1分)在安装nginx时,下列软件包不是必须安装的是?httpd3.(1分)使用哪个命令可以查看时间同步的源?chronyc4.(1分)在时间服务器中,下列哪个字段定义允......
  • NOIP2023模拟3联测24-博弈树
    NOIP2023模拟3联测24-博弈树目录NOIP2023模拟3联测24-博弈树题目大意思路code题目大意\(Alice\)和\(Bob\)又开始玩游戏了:给定一颗\(n\)个节点的树,\(Alice\)和\(Bob\)随机选择一个节点作为起点放上棋子,由Alice先手。轮到一方后可以将这颗棋子移动到树上任意一点,每次......
  • PSV-2020-0211-Netgear-R8300-UPnP栈溢出漏洞分析
    PSV-2020-0211-Netgear-R8300-UPnP栈溢出漏洞分析系统级模拟启动这个路由器的使用的upnpd来开放服务,执行/usr/sbin/upnpd后没有反应,使用ida看一下发现没有/var/run这个目录,那就创建一个mkdir-p/tmp/var/run(为什么是tmp下的是因为/var/run是软连接到/tmp/var/run)在......
  • kubernetes+docker+kubeadm快速安装
    1.Kubernetes1.27发布2023年4月13日,Kubernetes1.27正式发布,这是2023年的第一个版本。这个版本包括60项增强功能。其中18项增强功能进入Alpha、29项进入Beta,还有13项升级为Stable稳定版。2.环境准备2.1主机操作系统操作系统及版本备注CentOS7.9......
  • Kubernetes跨StorageClass迁移,切换Rainbond默认SC
    基于主机安装或基于Kubernetes安装的Rainbond集群(均使用默认参数安装),默认使用的共享文件存储是NFS,以Pod方式运行在Kubernetes中,但这种方式也有一些无法避免的问题,比如:NFS的SVC无法通信时集群无法挂载存储则导致不能使用、服务器关机时卡在umount导致不能正常关机等等......
  • Kubernetes跨StorageClass迁移,切换Rainbond默认SC
    基于主机安装或基于Kubernetes安装的Rainbond集群(均使用默认参数安装),默认使用的共享文件存储是NFS,以Pod方式运行在Kubernetes中,但这种方式也有一些无法避免的问题,比如:NFS的SVC无法通信时集群无法挂载存储则导致不能使用、服务器关机时卡在umount导致不能正常关机等等......
  • 模拟实现常见的strlen、strcpy、strcmp库函数,深入理解它们的原理
    ⛩️博主主页:@威化小餅干......