我想知道在进入Windows之前是否有办法拦截和修改鼠标输入?
我想要做的是截取鼠标移动事件,对值应用一些自定义缩放和加速,然后继续传递它们。在输入到达原始输入API或DirectInput之前,我需要能够做到这一点。
答案 0 :(得分:3)
为了在登录和SAS屏幕等过程中影响所有鼠标输入(包括DirectInput),您需要将过滤器驱动程序加载到鼠标驱动程序堆栈中。
其他人已经这样做了,例如http://www.maf-soft.de/mafmouse/
Windows DDK中应该有一个moufiltr
示例,您可以将其作为起点。您很可能希望使用虚拟机进行开发,因为开发计算机上的驱动程序中的错误可能难以从中恢复。
答案 1 :(得分:2)
您是否看过这种拦截鼠标和键盘输入的方法而无需制作过滤器驱动程序或钩子?
答案 2 :(得分:0)
有一个LowLevelMouseProc
挂钩程序,您可以使用它来获取有关进入系统的任何鼠标输入的信息,但我怀疑您是否可以更改此信息(并且文档是沉默于此。)
如果失败,GetMsgProc
可以让您拦截发布到任何窗口的所有邮件。虽然这个钩子可以让你修改消息,但对于像DirectInput这样的API有任何影响可能为时已晚。
答案 3 :(得分:0)
您可以尝试windows hook - 您设置的功能是在它们传递到系统的其余部分之前接收Windows消息 - CBT hook(用于基于计算机的培训)可能会获得你最好的结果。
我不知道这是否适用于DirectInput或MS添加的其他新东西,以打破所有旧的内部一致性。它很容易设置,所以试试看。
答案 4 :(得分:-1)
据我所知,最好的方法是挂钩到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);
((WINDOWPOS*)lParam)->flags = SWP_NOOWNERZORDER | SWP_NOMOVE;
break;
default:
break;
}
return ::CallWindowProc(m_nOldWindowProc, hwnd, message, wParam, lParam);