拦截鼠标输入

3
我在想是否有一种方法可以在鼠标输入到达Windows之前拦截和修改它?
我的意图是拦截鼠标运动事件,对值应用一些自定义缩放和加速,并继续传递它们。我需要的是在输入到达原始输入API或DirectInput之前就能够实现这一点的东西。

我在这里回答了这个问题:全局鼠标钩子+模拟鼠标输入。答案使用了我为此目的创建的库。 - oblitum
5个回答

3

3
为了影响所有的鼠标输入,包括DirectInput,在登录和SAS屏幕等情况下,您需要将过滤驱动程序加载到鼠标驱动程序堆栈中。
其他人已经做到了,例如http://www.maf-soft.de/mafmouse/ 在Windows DDK中应该有一个moufiltr示例,您可以将其用作起点。由于在开发计算机上的驱动程序错误可能难以恢复,因此您很可能需要使用虚拟机进行开发。

这似乎是影响原始输入API和DirectInput下方输入的唯一方法。对API进行重定向也可以满足我的需求,因为我只需要在每个进程中使用它。不过,我认为我会暂时不开发驱动程序,因为我没有为此设置工作流程,而且为了我想要做的事情,这似乎比它值得花费更多的精力。 - jay.lee

1

有一个LowLevelMouseProc钩子过程,您可以使用它来获取系统中输入的任何鼠标信息,尽管我怀疑您是否能够实际上更改这些信息(文档对此没有提及)。

如果这种方法失败了,GetMsgProc是一个替代方法,它允许您拦截发送到任何窗口的所有消息。虽然这种钩子确实允许您修改消息,但可能为时已晚,对于像DirectInput这样的API可能不会产生任何效果。


0

你可以尝试使用Windows Hook - 这些函数是您设置的,用于在消息传递到系统的其余部分之前接收窗口消息 - CBT Hook(计算机基础培训)可能会为您带来最佳结果。

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


-1
据我所知,最好的方法是钩取Windows消息循环。在您的情况下,您应该传递HWND 0(如果我记得正确,这是桌面的HWND),这样所有的消息都将首先通过您的函数。

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

关于hooks的更多内容:http://msdn.microsoft.com/en-us/library/ms644959%28VS.85%29.aspx

使用方法如下:

m_nOldWindowProc = ::SetWindowLong(0 /我想.../, 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方法。 - Ben Voigt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接