我想知道是否有一种方法来拦截和修改鼠标input之前,窗口?
我想要做的是拦截鼠标移动事件,应用一些自定义缩放和加速度值,然后继续传递它们。 我需要的东西,可以做到这一点之前,input到原始inputAPI或DirectInput。
为了影响所有鼠标输入,包括DirectInput,登录和SAS屏幕等,您需要将过滤器驱动程序加载到鼠标驱动程序堆栈中。
其他人已经做到了,例如http://www.maf-soft.de/mafmouse/
Windows DDK中应该有一个moufiltr
样本,您可以用它作为起点。 您很可能想要使用虚拟机进行开发,因为开发计算机上的驱动程序错误可能难以恢复。
你有没有看到这种拦截鼠标和键盘输入的方法,而不必做一个过滤器驱动程序或钩子?
有一个LowLevelMouseProc
钩子程序,你可以使用它来获取有关进入系统的任何鼠标输入的信息,但是我怀疑你是否真的可以改变这些信息(而且这个文档是沉默的)。
如果失败, GetMsgProc
是一个替代方案,可以拦截发布到任何窗口的所有消息。 虽然这个钩子可以让你修改消息,但是对DirectInput等API有任何影响可能已经太迟了。
你可以尝试一个windows钩子 – 这是你设置为接收windows消息传递到系统其余部分的函数 – CBT钩子 (用于基于计算机的培训)是什么可能会得到最好的结果。
我不知道这是否会与DirectInput或MS添加的其他新东西,以打破所有旧的内部一致性。 它很容易设置,所以试试看。
据我所知最好的办法是挂钩到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);
}