关于DirectX游戏中鼠标指针的问题...

sj720618 2012-07-09 04:05:48
我自己用DirectInput获取的鼠标位置总是和系统鼠标指针的位置有出入的,DirectInput的鼠标明显比系统鼠标要快很多,也就是说移动幅度大,每次都会比系统鼠标多移动一大块出去...查了一下,有高人说是绝对坐标和相对坐标的问题+_+

但是我看那些网游的鼠标指针移动速度都很正常...于是就做了个实验,小白鼠是腾讯代理的C9.

这个游戏平时是不显示鼠标指针的,移动鼠标会导致视角的变化.此时hook directInput函数,投放一些鼠标移动的假数据,游戏的视角会跟着转,说明此时使用的是directInput的数据.

游戏按ctrl会出现一个菜单,这时候鼠标指针就出现了,可以操控鼠标指针去点击菜单上的按钮什么的.这个指针是和系统的鼠标指针完全同步的.
首先,我在directInput函数中投放假数据,无效.然后干脆把directInput函数pass掉了,结果是鼠标指针依然正常显示,悬停在按钮上按钮也会正常变亮,但是点击等操作无效.说明鼠标指针的坐标不是从directInput函数得来的,但鼠标其他操作来自directinput.
然后,很自然就想到了会不会直接用的消息中的坐标,于是hook peekmessage,把消息里的pt强制改成500,500.测试,指针依然正常...索性直接把peekmessage pass掉,直接返回false...此时游戏窗口没有焦点的时候鼠标指针依然正常,即鼠标指针在窗口范围外为正常的白色三角样式,移动到游戏窗口范围内就会变成游戏里那种古铜色三角的样式,同时指针显示的坐标没有问题.
最后...难不成是GetCursorpos? hook getcursorpos,强制返回500,500 依然无效
把pass directinput函数,hook peekmessage,getcursorpos三种办法一起使用...c9依然正常的显示了鼠标指针

真想不明白了...求指点
...全文
741 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
sj720618 2012-09-19
  • 打赏
  • 举报
回复
ClientToScreen
GetCursorInfo
GetCursorPos
ScreenToClient
GetAsyncKeyState
GetKeyState
GetKeyboardState
WindowFromPoint

最后hook了这些api,再配合postmessage,才能正常的在游戏里模拟鼠标的移动
sj720618 2012-07-09
  • 打赏
  • 举报
回复
再一次实验....hook PeekMessage和GetCursorPos,把坐标都改成500,500这个固定值,directinput的函数没有做处理,让游戏正常调用的情况下, 鼠标指针一切正常,点击按钮的时候按钮能正常做出反应,说明点击的时候的坐标并不是通过消息和getcursorpos获取的
sj720618 2012-07-09
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

按你说的这个情况有可能在出现鼠标的界面中,游戏其实并没有自己画鼠标,而是在用系统鼠标
[/Quote]
刚才又试了下,hook了SetCursor和SetCursorPos. 指针移动到窗口范围内的时候游戏并没有调用SetCursor. 游戏窗口有焦点,鼠标在窗口边缘被挡住时也不是用的SetCursorPos来修改鼠标的位置.

sj720618 2012-07-09
  • 打赏
  • 举报
回复
再补充一下.
游戏窗口没有焦点的时候,鼠标指针移动到游戏窗口的范围内样式也会变,悬停在按钮上按钮也会变亮,悬停在技能图标上也会出现技能说明.
游戏窗口有焦点时,鼠标指针是移动不出窗口范围的,移动到边缘就会像遇到墙一样被挡住
一桶姜山 2012-07-09
  • 打赏
  • 举报
回复
按你说的这个情况有可能在出现鼠标的界面中,游戏其实并没有自己画鼠标,而是在用系统鼠标
sj720618 2012-07-09
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

directinput取相对坐标位置,游戏程序自己维护鼠标的位置。一般都是这个做法比较靠谱
[/Quote]
问题是游戏自己维护的鼠标位置是通过什么办法获取的呢? 不是directinput,不是消息,也不是getcursorpos...
一桶姜山 2012-07-09
  • 打赏
  • 举报
回复
directinput取相对坐标位置,游戏程序自己维护鼠标的位置。一般都是这个做法比较靠谱
sj720618 2012-07-09
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

重点在于:DirectInput直接与设备驱动交互,响应速度更快
[/Quote]
可是从试验结果上看...似乎C9并没有用directinput来处理鼠标指针的位置啊 GetDeviceData,GetDeviceState都被我hook,直接返回空值了,游戏实际上是得不到来自directinput的数据的,但是鼠标指针依然位置正常
qingyun95 2012-07-09
  • 打赏
  • 举报
回复
我是楼主...再补充一下,鼠标移动范围的限制是通过ClipCursor实现的,我重新调用一下ClipCursor(NULL),移动限制就接触了.
现在的问题还是游戏如何在点击的时候获得鼠标坐标的. 目前已经确定点击动作是通过directinput获取的,但坐标不是directinput,不是GetCursorPos,也不是Msg.pt,也不是把系统鼠标指针的图标换掉....
wuxupu 2012-07-09
  • 打赏
  • 举报
回复
重点在于:DirectInput直接与设备驱动交互,响应速度更快

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧