如何在实时 Windows 内核中延迟鼠标移动?

2024-05-02

您可以实时操纵 x 和 y 值,但如何延迟这些值以使光标看起来像缓慢移动到下一个位置。这可能吗?

我尝试过在 Windows 内核驱动程序中使用等待计时器,但我不认为这是如何完成的,我不知道。


最简单的延迟形式之一是定期采样(轮询),并将它们插入某种机器中,该机器将计算最后一次的平均值N样品。这有效地产生了从任何位置到任何其他位置的线性插值,延迟为N / SampleRate.

为了有效地做到这一点,您可以使用环形缓冲区。如果您在其中存储整数数据,则可以使用记忆来避免每次对整个缓冲区进行平均。相反,您只需保留一个运行总和,直到缓冲区已满,然后每次添加新值时,您首先减去以前的值(您将要替换的值)。

在 C++ 中,可能如下所示:

template<typename ValueType, size_t BufferSize>
struct SummedRingBuffer
{
public:
    void Append(const ValueType& value)
    {
        if (count < BufferSize) [[unlikely]]
        {
            buffer[tail] = value;
            sum += value;
            tail = ++count;
        }
        else [[likely]]
        {
            sum -= buffer[tail];
            buffer[tail] = value;
            sum += value;
            tail = (tail + 1) % BufferSize;
        }
    }

    const ValueType& GetSum() const   { return sum; }
    size_t GetCount() const           { return count; }

private:
    std::array<ValueType, BufferSize> buffer;
    ValueType sum   = {};
    size_t count    = 0;
    size_t tail     = 0;
};

现在,对于您的鼠标位置,只需使用以下两个缓冲区:

template<typename ValueType, size_t BufferSize>
struct DelayedMousePosition
{
public:
    void SetPos(const ValueType& x, const ValueType& y)
    {
        xvalues.Append(x);
        yvalues.Append(y);
    }

    void GetPos(ValueType& x, ValueType& y)
    {
        if (xvalues.GetCount() > 0)
        {
            x = xvalues.GetSum() / xvalues.GetCount();
            y = yvalues.GetSum() / yvalues.GetCount();
        }
    }
    
private:
    SummedRingBuffer<ValueType, BufferSize> xvalues;
    SummedRingBuffer<ValueType, BufferSize> yvalues;
};

您必须确保您的数据类型足够大,以便您推入其中的任何数据都不会溢出总和。所以,为了安全起见,你可以使用int64_t作为类型。您应该避免在此方法中使用浮点类型,因为它们可能会因精度误差而导致总和漂移。

无论如何,假设您每秒接收 60 次更新,并且您需要 500 毫秒的平滑窗口。嗯,这需要 30 个样本。所以你可以像这样设置延迟缓冲区:

DelayedMousePosition<int64_t, 30> delayedMousePos;

每次收到样本时,都将其推入缓冲区SetPos,然后用拉出平滑位置GetPos。就这么简单!没有动态分配或任何其他事情发生,并且它执行最少的处理,这正是您在驱动程序中想要的。也许对于内核的东西你需要切换出去std::array对于 C 风格的数组。我不知道。但这就好了,不需要其他修改。

现在,您可能会发现我没有做任何内核模式的事情,并且我怀疑现在大多数驱动程序中通常不进行轮询。至少对于 HID 设备来说不是。因此,您可能需要采取一些额外的技巧才能完成这项工作。但鉴于您的问题缺乏具体细节,我认为这是一个合理的起点。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在实时 Windows 内核中延迟鼠标移动? 的相关文章

  • CLR 2.0 与 4.0 性能比较?

    如果在 CLR 4 0 下运行 为 CLR 2 0 编译的 NET 程序会运行得更快吗 应用程序配置
  • 查找进程的完整路径

    我已经编写了 C 控制台应用程序 当我启动应用程序时 不使用cmd 我可以看到它列在任务管理器的进程列表中 现在我需要编写另一个应用程序 在其中我需要查找以前的应用程序是否正在运行 我知道应用程序名称和路径 所以我已将管理对象搜索器查询写入
  • 为什么在 WebApi 上下文中在 using 块中使用 HttpClient 是错误的?

    那么 问题是为什么在 using 块中使用 HttpClient 是错误的 但在 WebApi 上下文中呢 我一直在读这篇文章不要阻止异步代码 https blog stephencleary com 2012 07 dont block
  • 使用 GCP 的数据存储区时如何区分代码是在模拟器中运行还是在 GKE 中运行

    按照中给出的说明进行操作后 我不确定是否遗漏了任何内容https cloud google com datastore docs tools datastore emulator https cloud google com datasto
  • 对 std::vector 进行排序但忽略某个数字

    我有一个std vector
  • Python 属性和 Swig

    我正在尝试使用 swig 为一些 C 代码创建 python 绑定 我似乎遇到了一个问题 试图从我拥有的一些访问器函数创建 python 属性 方法如下 class Player public void entity Entity enti
  • 类型约束

    我有以下类层次结构 class Header IEnumerable
  • 启动时的 Excel 加载项

    我正在使用 Visual C 创建 Microsoft Excel 的加载项 当我第一次创建解决方案时 它包含一个名为 ThisAddIn Startup 的函数 我在这个函数中添加了以下代码 private void ThisAddIn
  • IQueryable 单元或集成测试

    我有一个 Web api 并且公开了一个端点 如下所示 api 假期 name name 这是 Web api 的控制器 get 方法 public IQueryable
  • 为什么这个二维指针表示法有效,而另一个则无效[重复]

    这个问题在这里已经有答案了 这里我编写了一段代码来打印 3x3 矩阵的对角线值之和 这里我必须将矩阵传递给函数 矩阵被传递给指针数组 代码可以工作 但问题是我必须编写参数的方式如下 int mat 3 以下导致程序崩溃 int mat 3
  • 在mysql连接字符串中添加应用程序名称/程序名称[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我正在寻找一种解决方案 在连接字符串中添加应用程序名称或程序名称 以便它在 MySQL Workbench 中的 客户端连接 下可见 SQL
  • C++ int 前面加 0 会改变整个值

    我有一个非常奇怪的问题 如果我像这样声明一个 int int time 0110 然后将其显示到控制台返回的值为72 但是当我删除前面的 0 时int time 110 然后控制台显示110正如预期的那样 我想知道两件事 首先 为什么它在
  • 高效列出目录中的所有子目录

    请参阅迄今为止所采取的建议的编辑 我正在尝试使用 WinAPI 和 C 列出给定目录中的所有目录 文件夹 现在我的算法又慢又低效 使用 FindFirstFileEx 打开我正在搜索的文件夹 然后我查看目录中的每个文件 使用 FindNex
  • 打印大型 WPF 用户控件

    我有一个巨大的数据 我想使用 WPF 打印 我发现WPF提供了一个PrintDialog PrintVisual用于打印派生的任何 WPF 控件的方法Visual class PrintVisual只会打印一页 因此我需要缩放控件以适合页面
  • String.Empty 与 "" [重复]

    这个问题在这里已经有答案了 可能的重复 String Empty 和 有什么区别 https stackoverflow com questions 151472 what is the difference between string
  • 这个可变参数模板示例有什么问题?

    基类是 include
  • 使用 C 在 OS X 中获取其他进程的 argv

    我想获得其他进程的argv 例如ps 我使用的是在 Intel 或 PowerPC 上运行的 Mac OS X 10 4 11 首先 我阅读了 ps 和 man kvm 的代码 然后编写了一些 C 代码 include
  • 为boost python编译的.so找不到模块

    我正在尝试将 C 代码包装到 python 中 只需一个类即可导出两个函数 我编译为map so 当我尝试时import map得到像噪音一样的错误 Traceback most recent call last File
  • 是否可以在不连接数据库的情况下检索 MetadataWorkspace?

    我正在编写一个需要遍历实体框架的测试库MetadataWorkspace对于给定的DbContext类型 但是 由于这是一个测试库 我宁愿不连接到数据库 它引入了测试环境中可能无法使用的依赖项 当我尝试获取参考时MetadataWorksp
  • 不区分大小写的字符串比较 C++ [重复]

    这个问题在这里已经有答案了 我知道有一些方法可以进行忽略大小写的比较 其中涉及遍历字符串或一个good one https stackoverflow com questions 11635 case insensitive string

随机推荐

  • 使用rapidjson设置浮点精度

    有没有办法控制使用rapidjson生成的JSON的输出精度 例如 writer String length writer Double 1 0 3 0 这会生成类似以下内容的内容 length 0 33333333 我发送了很多值 并且几
  • 如何使小部件溢出以使滚动条出现在 Qt 中?

    我的小部件的结构是 QWidget 定制为带有圆角边框的面板 要在边界内包含一个带有滚动条并带有边距的区域 然后我将其放入其中 QScrollArea 与 QVBoxLayout 垂直添加内容 然后我在其中添加一系列 标题间距为 0 的 Q
  • 从 C# 程序集中执行 JavaScript

    我想从 C 程序集中执行 JavaScript 代码 并将 JavaScript 代码的结果返回到调用 C 代码 定义我不想做的事情更容易 我并不是试图从我的代码隐藏中调用网页上的 JavaScript 函数 我不想加载 WebBrowse
  • 在 Windows 上使用 PHP 进行分叉/线程的最佳方法是什么?

    我有一个 php 脚本 用于检查许多 数千个 网站上的更新 有时 随着站点数量的增加 情况会更频繁 我在更新其中一个站点时会遇到执行超时 整个脚本都会付诸东流 我能想到的最好的想法是分叉每个更新 所以如果它死了 整体更新就会继续 从我收集到
  • subject.next 不在 ngOnInit 中触发

    有谁知道为什么这段代码 从主题初始化一个值 不起作用 是否存在错误或设计使然 我究竟做错了什么 ts import Component OnInit from angular core import Subject from rxjs Co
  • 载波扩展白名单不工作

    这是一个类似的案例 但没有解决方案CarrierWave extension white list 似乎不起作用 https stackoverflow com questions 11348510 carrierwave extensio
  • 使用 JDK8 时,LogManager.getLogger 会使应用程序停止大约 10-30 秒:

    更新 1 我做了更多测试 删除了大部分库并注释掉了库特定代码 导致了相同的行为 这让我得出结论 这个问题不是 直接 由这些库引起的 但似乎是我的一个普遍问题代码和 或设置 这里的主要问题是我不明白为什么它在从 Eclipse 内部启动时运行
  • 我的 on_member_join 事件不起作用。我尝试了意图,但它给出了这个错误

    考虑 最近一次通话最后 文件 randomgg py 第 1271 行 位于 u003cmodule u003e 中客户端 运行 令牌 文件 usr local lib python3 8 site packages discord cli
  • 如何在 javadoc 编译期间抑制警告(代码库范围内)?

    我被困在一个遗留的 Java 代码库中 当你编译它时 它有数千个警告 我很想真正修复所有这些警告的来源 但不幸的是 目前在我的公司这不是一个选择 负责人认为 制造可产生收入的新产品 等其他事情被认为是更优先的事情 想象一下 现在 如果不是因
  • 用子矩阵替换 numpy 矩阵元素

    鉴于我有一个索引方阵 例如 idxs np array 1 1 0 1 以及彼此大小相同的方阵数组 不一定与idxs mats array 0 0 0 0 5 1 0 3 1 1 我想替换每个索引idxs对应的矩阵为mats 得到 arra
  • Docker 中的 Keycloak“无法将代码转换为令牌”

    我正在 Docker compose 网络中运行 Keycloak keycloak Security Proxy 和 ui 应用程序 当我尝试访问该网页时 我得到一个可以使用的登录页面 但我没有成功重定向 而是收到以下错误 gt Aug
  • 控制台应用程序的 log4net 配置

    谁能建议如何为控制台应用程序配置 log4net 或者至少如何 在哪里捕捉Application Start事件 看来此时需要一些电话 提前致谢 尝试写作 assembly log4net Config XmlConfigurator Wa
  • Vimscript 检查当前缓冲区是否有未保存的更改

    我目前已设置状态行 使其在插入模式下为橙色 否则为白色 如果文件有任何未保存的更改 我想让它在我回到正常模式时变成另一种颜色 因为我经常在兔子洞里走一会儿 想知道为什么我的更改没有生效 小 还不够打我的脸 我找不到任何以 buf 开头且看起
  • 如何将零件逐一添加到闪亮的图表中

    我正在尝试为我的统计课程制作一些演示 除此之外 我想展示所涉及的逐步过程 对于我正在寻找的简化示例 请考虑以下小玩具 R 函数 toyPlot lt function x lt 1 100 100 y lt x rnorm 100 0 0
  • 当前不会命中切换断点。断点已设置但尚未绑定

    我在 Visual Studio 2019 中创建了一个 asp net core mvc 项目 我看到其他人讨论这个问题并做了以下工作 调试模式设置为调试 而不是发布 删除了 bin 和 obj 文件夹 清理并重建解决方案 删除所有断点
  • python 中的多线程:大多数时候它真的性能高效吗?

    据我所知 驱动编程的是性能因素multi threading在大多数情况下 但不是全部 无论 Java 还是 Python 我正在读这个启发性文章 https stackoverflow com questions 265687 why t
  • 如何使用 iText 对 pdf 进行数字签名?

    如何使用 iText 签署 pdf 我正在经历这个LINK http itextpdf sourceforge net howtosign html但不了解 my private key pfx 我真的需要数字签名证书吗 请澄清我 提前致谢
  • 连接 XML 中多个节点的值 - 使用 XSLT

    这是测试 XML 而不是原始 XML 我需要仅提取 bloggrs 块中存在博客 ID 的博客网站 是否可以仅使用 XSLT 我认为不是
  • Angular2:用组件的模板替换主机元素

    我是新来的angular一般而言并且angular2具体来说 我正在尝试编写一个容器组件 其中应该包含子组件 例如容器组件 Component selector my list template ul ul
  • 如何在实时 Windows 内核中延迟鼠标移动?

    您可以实时操纵 x 和 y 值 但如何延迟这些值以使光标看起来像缓慢移动到下一个位置 这可能吗 我尝试过在 Windows 内核驱动程序中使用等待计时器 但我不认为这是如何完成的 我不知道 最简单的延迟形式之一是定期采样 轮询 并将它们插入