【问题标题】:Intercept mouse input拦截鼠标输入
【发布时间】:2010-10-03 21:16:30
【问题描述】:

我想知道是否有办法在鼠标输入进入 Windows 之前拦截和修改它?

我想要做的是拦截鼠标运动事件,对这些值应用一些自定义缩放和加速,然后继续传递它们。在输入到达原始输入 API 或 DirectInput 之前,我需要一些可以做到这一点的东西。

【问题讨论】:

标签: c++ c windows winapi input


【解决方案1】:

为了在登录和 SAS 屏幕等期间影响所有鼠标输入,包括 DirectInput,您需要将过滤器驱动程序加载到鼠标驱动程序堆栈中。

其他人做过,例如http://www.maf-soft.de/mafmouse/

Windows DDK 中应该有一个moufiltr 示例,您可以将其用作起点。您很可能希望使用虚拟机进行开发,因为您的开发机器上的驱动程序中的错误可能难以恢复。

【讨论】:

  • 这似乎是影响原始输入 API 和 DirectInput 下方输入的唯一方法。绕道 API 也适用于我的目的,因为我只需要在每个进程的基础上使用它。不过,我想我会推迟开发驱动程序,我真的没有为此设置工作流程,而且对于我想做的事情来说,这似乎比它值得付出更多的努力。
【解决方案2】:

您是否见过这种无需制作过滤器驱动程序或挂钩即可拦截鼠标和键盘输入的方法?

http://oblita.com/Interception.html

【讨论】:

    【解决方案3】:

    有一个LowLevelMouseProc 钩子程序,您可以使用它来获取有关进入系统的任何鼠标输入的信息,尽管我怀疑您是否真的可以更改此信息(并且文档对这个)。

    如果失败,GetMsgProc 是一种替代方法,可让您拦截发布到任何窗口的所有消息。虽然这个钩子确实让您可以修改消息,但对 DirectInput 等 API 产生任何影响可能为时已晚。

    【讨论】:

      【解决方案4】:

      您可以尝试 windows hook - 您设置为在 Windows 消息传递到系统其余部分之前接收这些消息的功能 - CBT hook(用于基于计算机的培训)可能会为您带来最佳结果。

      我不知道这是否适用于 DirectInput 或 MS 添加的其他新内容以打破所有旧的内部一致性。不过它很容易设置,所以试试看吧。

      【讨论】:

        【解决方案5】:

        据我所知,最好的方法是挂钩到 Windows 消息循环,在您的情况下,您应该传递 HWND 0(如果我没记错的话,这是桌面的 HWND),因此所有消息都会首先通过您的函数。

        http://msdn.microsoft.com/en-us/library/ms633591%28VS.85%29.aspx

        更多关于钩子的信息:http://msdn.microsoft.com/en-us/library/ms644959%28VS.85%29.aspx

        如下使用:

        m_nOldWindowProc = ::SetWindowLong(0 /I think.../, GWL_WNDPROC, (LPARAM)(WNDPROC)WindowProcCallback);

        和回调:

        LRESULT CALLBACK CStubWindow::WindowProcCallback(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_WINDOWPOSCHANGING: ((WINDOWPOS*)lParam)->cx = STATUS_BAR_WIDTH;

            ((WINDOWPOS*)lParam)->flags =  SWP_NOOWNERZORDER | SWP_NOMOVE;
            break;
        
        default:
            break;
        }
        return ::CallWindowProc(m_nOldWindowProc, hwnd, message, wParam, lParam);
        

        }

        【讨论】:

        • 该问题专门针对与 DirectInput 一起使用的方法。
        猜你喜欢
        • 1970-01-01
        • 2011-10-25
        • 1970-01-01
        • 2019-06-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-26
        • 1970-01-01
        相关资源
        最近更新 更多