找回密码
 加入
搜索
查看: 3629|回复: 10

请问如何确定一个窗口的客户区的准确地址??

[复制链接]
发表于 2009-3-9 20:55:51 | 显示全部楼层 |阅读模式
使用wingetpos命令可以确定一个窗口的x坐标、y坐标、宽度和高度,而使用WinGetClientSize命令则只能获得窗口客户区的宽度和高度。同样的一个窗口,在不同的系统主题下,尽管其客户区的宽度和高度是不变的,但是由于各种主题对窗口的设置不同,其标题栏和边框所占用的像素点是不同的,这将导致窗口在不同的主题设置下,其客户区的屏幕绝对坐标发生变化。我的问题是:有没有方法精确地获得一个窗口的客户区的坐标值或者是其绝对坐标的变化值呢??

[ 本帖最后由 ahphsautoit 于 2009-3-11 10:43 编辑 ]
发表于 2009-3-10 09:53:31 | 显示全部楼层
你的问题就是确定客户区在窗体区的位置吧?
不知下列假设对不对:
1,左、右、下的3个边框宽度是一致的。
2,客户区总是位于窗体区最下端的。

如果以上假设成立,那么客户区的左上角相对窗体的的坐标计算应该是:

WinWaitActive("窗体标题")
$WNxy=WinGetPos("窗体标题")
$CWxy=WinGetClientSize("窗体标题")
$S=($WNxy[2]-$CWxy[0])/2
$X=$S
$Y=$WNxy[3]-$CWxy[1]-$S
MsgBox(64,"客户区在窗口的位置坐标是","X="&$X&@CRLF&"Y="&$Y)
 楼主| 发表于 2009-3-10 11:18:23 | 显示全部楼层
非常感谢!你的意思我看明白了。只是有一点点问题,关于你的第一个假设,因为在有些情况下,一个窗口的下边栏似乎看起来就比左右边框要大些,不和左右边框相等,这种情况下就不太容易确定窗口客户区高度上的上、下坐标了。
另外,我想到一个思路:
1、先确定窗口客户区中某一个点A的屏幕绝对坐标$x,$y(也就是默认的原始当前窗口的相对坐标);
2、当因为主题等原因导致窗口大小发生变化时,先用OPT设置鼠标坐标为当前激活窗口相对坐标,将鼠标移动到当前激活窗口的$x,$y上,再得到该点的屏幕绝对坐标$x0,$y0。将$x0、$y0和$x、$y相减,就能得到点A的相对移动坐标。
但是这种方法我遇到一个无法逾越的鸿沟,就是我需要处理的是一个游戏窗口,在游戏窗口激活的情况下,根本不响应鼠标的模拟动作,我采用的是令游戏窗口处于非激活状态,这时候鼠标的模拟动作会响应,在鼠标移动在预定坐标时点击游戏窗口时在点击的同时激活游戏窗口,游戏窗口能对这种点击响应。所以在这种情况下我无法完成“将鼠标移动到当前激活窗口的$x,$y上”这个动作,郁闷啊!呵呵,不知道你还有别的方法可以解决这个问题吗?期待中。。。
 楼主| 发表于 2009-3-10 11:37:24 | 显示全部楼层
我提出这个问题的初衷就是因为游戏窗口在激活状态下不响应鼠标的模拟点击动作,不能使用当前激活窗口相对坐标而只能使用屏幕绝对坐标在游戏窗口非激活的情况下先移动鼠标到预定屏幕绝对坐标后再在点击的同时激活游戏窗口。
 楼主| 发表于 2009-3-10 11:51:10 | 显示全部楼层
刚刚灵光一闪:游戏窗口的客户区的大小是800×600不变的,能不能造一个窗口也是800×600的,用这个造的普通窗口来完成“将鼠标移动到当前激活窗口(普通窗口)的$x、$y上”这个动作,这样得到的绝对坐标$x0、$y0,是不是就是游戏窗口中点A的绝对坐标呢?如果这种方法能行的话,我的问题也就迎刃而解了。晚上试验试验。
发表于 2009-3-10 11:56:36 | 显示全部楼层
祝你成功~~~~~~
 楼主| 发表于 2009-3-10 16:13:13 | 显示全部楼层
Sorry!
实验过了,因为不管是屏幕绝对坐标还是窗体相对坐标,都是从边框边开始计算的,我在3楼的想法,只能捕获窗体位置变化所带来的A点坐标变化,可以通过命令重置窗体位置而确保A点的屏幕绝对坐标不变。但是这种方法对窗体大小改变而导致的A点坐标漂移无能为力。
 楼主| 发表于 2009-3-10 18:00:06 | 显示全部楼层
惭愧,没有仔细阅读帮助啊,发现在鼠标设置命令里还有个相对客户区的坐标选项。刚刚用两个普通的窗口(在办公室呢,不敢开游戏)进行了模拟测试,成功!晚上回家实战!
发表于 2009-3-10 19:42:24 | 显示全部楼层
干着公差,想着私事。小心被炒了
 楼主| 发表于 2009-3-11 08:27:32 | 显示全部楼层
成功啦!!非常感谢你的参与,不然可能我早就放弃探索了,再次感谢!

第一步:先临时取得参考点的客户区坐标值
WinActivate("倚天屠龙管理器");激活一个非游戏窗口
Mousemove (250,250,1);任意将鼠标移动到游戏窗口中的某一点坐标
opt("MouseCoordMode",2);设置鼠标坐标参照为窗口客户区相对坐标
$ckx=mousegetpos(0);获取该点的客户区相对X坐标
$cky=mousegetpos(1);获取该点的客户区相对Y坐标

第二步:将获得的客户区相对坐标值如:X=232,Y=220 录入正式的命令里:
WinActivate("倚天屠龙管理器");激活一个非游戏窗口
Mousemove (250,250,1);任意将鼠标移动到游戏窗口中的某一点坐标
opt("MouseCoordMode",2);设置鼠标坐标参照为窗口客户区相对坐标
$ckx=mousegetpos(0);获取该点的客户区相对X坐标
$cky=mousegetpos(1);获取该点的客户区相对Y坐标
opt("mousecoordmode"1);恢复鼠标参考坐标为屏幕绝对坐标
winmove("倚天剑与屠龙刀","",$ckx-232,$cky-220);根据获得的当前参考点坐标计算坐标漂移量重置游戏窗口位置
这样的结果就是不管窗体怎样移动过或是窗体大小被改变,参考点最终都会被置于当初设计时的屏幕绝对坐标上。

[ 本帖最后由 ahphsautoit 于 2009-3-11 08:34 编辑 ]
发表于 2009-3-11 12:44:29 | 显示全部楼层
祝贺,聪明人总会找到措施的。赞一个
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-5-2 10:37 , Processed in 0.077281 second(s), 19 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表