再度发帖求问,请看看

IT保安 2014-04-02 11:44:28
.if		ax == IDC_CAPTURE  ;初始状态捕获窗口左上坐标		
invoke FindWindow,NULL,offset szGameTitle
mov hGame,eax
invoke GetWindowRect,hGame,addr @rect
invoke SetDlgItemInt,hWnd,IDC_POXEDIT,@rect.left,FALSE
invoke SetDlgItemInt,hWnd,IDC_POYEDIT,@rect.top,FALSE
.elseif ax == IDC_STGAME ;按开始键后,鼠标移动到指定位置,即游戏窗口的开始游戏
;invoke Sleep,1000
invoke SetCursorPos,@rect.left+654,@rect.top+574

当执行到invoke SetCursorPos,@rect.left+654,@rect.top+574 这里,错误出现了,鼠标基本上就是乱飞了!
我仔细看了一下rect结构和setcursorpos函数,rect结构是long型的,setcursorpos要求的参数是int型的,我想是因为参数不匹配而导致的这一结果吧,我将setcursorpos的参数改成常量,那么就是正常的鼠标移动了!
我比较纳闷啊,书上是这么说的:win32环境中的参数实际上只有一种类型,那就是dword。那么为什么还会这样呢?
并且我看别人在VC上面做的,也是用rect结构和setcursorpos函数,都不经过强制转换就可以了!
那么在汇编里面,对于这种状况,该如何处理呢?用常量可不行啊!
...全文
146 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
summerxia1 2014-04-03
  • 打赏
  • 举报
回复
楼上正解!!
zara 2014-04-02
  • 打赏
  • 举报
回复
下面这个 SetCursorPos() 所使用的 @rect 又没有被上面的 GetWindowRect() 赋值,两个是不同的 if 条件里的吧,其中的内容自如是乱的了,以此来设置光标位置出现乱飞很正常吧。
是不是没有调试过啊,看过你发过的些帖子,问题本身其实并不复杂,调试再反溯,很容易就能发现问题所在的。
zara 2014-04-02
  • 打赏
  • 举报
回复
你在 od 里看上面的那个生成的代码就明白了,参数里的加法,不被支持的,被当做偏移了。
我觉得宁可汇编自身上的进度放一放,也要能使用调试软件;有问题了先上调试软件,在疑问的地方断点,看当时现场和预想的哪里不同,根据这个再回溯,这样找出问题多是比较简单的。
IT保安 2014-04-02
  • 打赏
  • 举报
回复
改成这样就可以了: 1.@rect改为全局变量 2.
.elseif	ax == IDC_STGAME	;按开始键后,鼠标移动到指定位置,即游戏窗口的开始游戏
							push	eax
							mov		eax,654
							add		@rect.left,eax
							mov		eax,574
							add		@rect.top,eax
							pop		eax
							invoke	SetCursorPos,@rect.left,@rect.top
将此分支结构加法提前写出来! 我就纳闷了,为什么不能直接在SetCursorPos函数里,对参数进行加法呢?
IT保安 2014-04-02
  • 打赏
  • 举报
回复
按照我的设计,一定是先执行.if ax == IDC_CAPTURE这个分支,在这里面@rect已经被赋值了,顺序到.elseif ax == IDC_STGAME这个分支的时候,刚好把@rect拿来用嘛。 我还不会调试呢,OD什么的暂时还不太会用,我把.elseif ax == IDC_STGAME这一句注释掉,结果一样的,鼠标跑到屏幕左下角去了!

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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