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

虽然挺有意思,但是太肝了,入坑前请谨慎。补充一下,这个游戏应该是基于 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”退出。

键位与其他

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

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

简单实现.NET Hook与事件模拟的更多相关文章

  1. 深入理解DOM事件机制系列第四篇——事件模拟

    × 目录 [1]引入 [2]模拟机制 [3]自定义事件 前面的话 事件是网页中某个特别的瞬间,经常由用户操作或通过其他浏览器功能来触发.但实际上,也可以使用javascript在任意时刻来触发特定的事 ...

  2. c#全局鼠标事件以及鼠标事件模拟

    最近在编写Max插件时,其主容器FlowLayoutPanel由于隐藏了滚动条,要实现按住鼠标中键上下拖动的功能,因此尝试了全局鼠标事件.以及鼠标勾子,可惜由于Max不争气?都未能实现,于是代码报废, ...

  3. 第十五篇 JS 移入移出事件 模拟一个二级菜单

    JS 移入移出事件 模拟一个二级菜单   老师演示一个特别简单二级菜单,同学们除了学习JS,还要注意它的元素和CSS样式. 这节课介绍的是JS鼠标移入.移出事件:onmouseover是移入事件,on ...

  4. trigger事件模拟

    事件模拟trigger 在操作DOM元素中,大多数事件都是用户必须操作才会触发事件,但有时,需要模拟用户的操作,来达到效果. 需求:页面初始化时触发搜索事件并获取input控件值,并打印输出(效果图如 ...

  5. 浅谈Javascript事件模拟

    事件是用来描述网页中某一特定有趣时刻的,众所周知事件通常是在由用户和浏览器进行交互时触发,其实不然,通过Javascript可以在任何时间触发特定的事件,并且这些事件与浏览器创建的事件是相同的.这就意 ...

  6. 浅谈JavaScript的事件(事件模拟)

    事件经常由操作或者通过浏览器功能触发,通过JavaScript也可以触发元素的事件.通过JavaScript触发事件,也称为事件的模拟. DOM中事件模拟 可以document的createEvent ...

  7. Javascript高级编程学习笔记(72)—— 模拟事件(2)IE事件模拟

    IE中的事件模拟 低版本的IE浏览器作为前端开发的一股清流,想避过都不行 虽然低版本IE正在逐步被市场淘汰,不得不承认IE8以下的浏览器依然占了不小的份额 所以这里大概介绍IE8以下的低版本IE中的事 ...

  8. Javascript高级编程学习笔记(71)—— 模拟事件(1)DOM事件模拟

    事件,指的是网页中某个特定的交互时刻 一般来说事件由浏览器厂商负责提供,一般由用户操作或者其它浏览器功能来触发 但是有一类特殊的事件,那就是由我们开发人员通过JS触发的事件 这些事件和浏览器创建的事件 ...

  9. selenium:2.selenium 键盘事件模拟

    今晚不想加班,于是赶紧回来看看书,不知道今天怎么就突然特别想玩文明五,但是又要克制自己咯,所以还是看看书吧,干的事情有: 1.下了selenium的小工具:FireBug/FirePath. 2.确定 ...

  10. JavaScript事件模拟元素拖动

    一.前言: 最近要实现一个元素拖放效果,鼠标拖动元素并且定位元素,首先想到的是HTML5中的拖放,在HTML5中,有一个draggable属性,且有dragstart, dragover, drop等 ...

随机推荐

  1. github上传文件报错failed to push some refs解决

    报错内容,不能推送文件到github上 error: failed to push some refs to github地址 原因是github项目与本地文件夹一些关键文件的确实,比如.git,re ...

  2. 【转载】Linux虚拟化KVM-Qemu分析(八)之virtio初探

    原文信息 作者:LoyenWang 出处:https://www.cnblogs.com/LoyenWang/ 公众号:LoyenWang 版权:本文版权归作者和博客园共有 转载:欢迎转载,但未经作者 ...

  3. AMH安装Nextcloud出现Access denied

    AMH部署了LAMP或者LNMP,然后常规安装Nextcloud,安装完成后跳转到首页就出现Access denied.Nextcloud的文件夹权限已经修改,可读写.http://127.0.0.1 ...

  4. Nginx TCP 负载均衡:stream 模块配置

    工作上遇到需要用nginx做负载均衡,参考了前同事留下的作业顺利搞定,感觉这块很有意义写篇文档记录. 参考:nginx tcp负载均衡(Stream模块)配置说明 参考:利用nginx进行TCP负载均 ...

  5. 删除 /tmp 目录下长时间未访问的文件

    #!/bib/bash DIR=/tmp cd $DIR || { echo "Dir not Found: $Dir" exit } echo "Delete a fi ...

  6. Magick.NET跨平台压缩图片的用法

    //首先NuGet安装:Magick.NET.Core,Magick.NET-Q16-AnyCPUusing ImageMagick; /// <summary> /// 压缩图片 /// ...

  7. OpenCV实战:从图像处理到深度学习的全面指南

    本文深入浅出地探讨了OpenCV库在图像处理和深度学习中的应用.从基本概念和操作,到复杂的图像变换和深度学习模型的使用,文章以详尽的代码和解释,带领大家步入OpenCV的实战世界. 1. OpenCV ...

  8. 《Kali渗透基础》06. 主动信息收集(三)

    @ 目录 1:服务识别 1.1:NetCat 1.2:Socket 1.3:dmitry 1.4:nmap 2:操作系统识别 2.1:Scapy 2.2:nmap 2.3:p0f 3:SNMP 扫描 ...

  9. MATLAB入门小操作(数据类型)

    这是一篇有助于快速上手MATLAB软件的文章(新手向).(学习过其他的语言更容易看懂) 数据类型 这篇文章我想从MATLAB中的数据类型出发去列举一些经常使用的操作.MATLAB中的数据类型包括其他语 ...

  10. WPF MVVM之点滴分享

    (第五点:绑定源有修改) 我并不打算长篇累牍的介绍什么是MVVM.我尽量简洁的介绍,并把自己的经验分享给大家. 一.关于MVVM M:Model,数据模型(后台存储数据的类) V:View,视图(大部 ...