我的意图是拦截鼠标运动事件,对值应用一些自定义缩放和加速,并继续传递它们。我需要的是在输入到达原始输入API或DirectInput之前就能够实现这一点的东西。
moufiltr
示例,您可以将其用作起点。由于在开发计算机上的驱动程序错误可能难以恢复,因此您很可能需要使用虚拟机进行开发。有一个LowLevelMouseProc
钩子过程,您可以使用它来获取系统中输入的任何鼠标信息,尽管我怀疑您是否能够实际上更改这些信息(文档对此没有提及)。
如果这种方法失败了,GetMsgProc
是一个替代方法,它允许您拦截发送到任何窗口的所有消息。虽然这种钩子确实允许您修改消息,但可能为时已晚,对于像DirectInput这样的API可能不会产生任何效果。
你可以尝试使用Windows Hook - 这些函数是您设置的,用于在消息传递到系统的其余部分之前接收窗口消息 - CBT Hook(计算机基础培训)可能会为您带来最佳结果。
我不知道这是否适用于DirectInput或MS添加的其他新内容,以打破所有旧的内部一致性。不过设置很容易,所以可以尝试一下看看。
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);
}