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

这篇具有很好参考价值的文章主要介绍了简单实现.NET Hook与事件模拟。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

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

键位与其他

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

另外,我 Hook 上方 F 功能键的时候一直不成功,但是 ESC 是可以正常被响应的,没有深入去研究为什么,以后确实有必要了再看看。文章来源地址https://www.toymoban.com/news/detail-711344.html

到了这里,关于简单实现.NET Hook与事件模拟的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 星露谷物语(Stardew Valley)Mod Farmtronics 机器人自动浇水代码

    模组介绍:【星露谷物语】你想要一群可爱可编程的工作机器人吗?Farmtronics模组介绍_哔哩哔哩_bilibili Farmtronics使用的编程语言语法 MiniScript-QuickRef.pages Api 接口参考 ·乔斯特劳特/法姆电子学维基 ·吉特哈布 (github.com) Farmtronics.zip-10634-1-2-0-1658871311 SMAPI 3.16.2 1.机器人使用笛卡

    2024年02月09日
    浏览(41)
  • react实现模拟弹框遮罩的自定义hook

    点击按钮用于检测鼠标是否命中按钮 React好玩的自定义hook-useClickOutSide_哔哩哔哩_bilibili

    2024年02月12日
    浏览(40)
  • NSubstitute:一个简单易用、灵活多变的.NET单元测试模拟框架

    推荐一个简单易用、灵活多变的.NET单元测试模拟框架,让开发者能够更轻松地进行单元测试。 NSubstitute是一个开源的.NET单元测试模拟类库,该框架设计的主要目标是提供一个简单明了、易用性强、贴近自然语言的模拟测试框架。它使得开发者能够专注于测试工作,而不是纠

    2024年02月07日
    浏览(46)
  • 前端实现简单的sse封装(React hook Vue3)

    所谓的SSE(Sever-Sent Event),就是浏览器向服务器发送了一个HTTP请求,保持长连接,服务器不断单向地向浏览器推送“信息”,这么做是为了节省网络资源,不用一直发请求,建立新连接。 优点:SSE和WebSocket相比,最大的优势是便利,服务端不需要第三方组件,开发难度低,SSE和

    2024年02月09日
    浏览(44)
  • .NET6 项目使用RabbitMQ实现基于事件总线EventBus通信

    一、概念及介绍         通常通过使用事件总线实现来执行此发布/订阅系统。 事件总线可以设计为包含 API 的接口,该 API 是订阅和取消订阅事件和发布事件所需的。 它还可以包含一个或多个基于跨进程或消息通信的实现,例如支持异步通信和发布/订阅模型的消息队列或

    2024年04月28日
    浏览(51)
  • Qt拖拽事件简单实现

    重写resizeEvent(这个按需重写)、dragEnterEvent(拖拽事件函数)、dropEvent(放下事件函数),可以将本地图片拖拽到label标签中  

    2024年01月20日
    浏览(48)
  • 模拟实现.net中的Task机制:探索异步编程的奥秘

    .net中使用Task可以方便地编写异步程序,为了更好地理解Task及其调度机制,接下来模拟Task的实现,目的是搞清楚: Task是什么 Task是如何被调度的 从最基本的Task用法开始 这个命令的作用是将action作为一项任务提交给调度器,调度器会安排空闲线程来处理。 我们使用Job来模拟

    2024年02月06日
    浏览(37)
  • .net 8 发布了,试下微软最近强推的MAUI

    先看下实现的效果: 下面发下XAML文件: .cs文件: 下一个示例实现调用手机的蓝牙或者一些设备。

    2024年02月04日
    浏览(45)
  • 哈希表的简单模拟实现

    初识哈希 哈希表是一种查找效率及其高的算法,最理想的情况下查询的时间复杂度为O(1)。 unordered_map 容器通过 key 访问单个元素要比 map 快,但它通常在遍历元素子集的范围迭代方面效率 较低。 unordered 系列的关联式容器之所以效率更高,是因为底层采用了哈希的结构。 哈希

    2024年02月15日
    浏览(45)
  • 模拟实现一个简单的计算器

    2024年02月11日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包