最近又在用ahk进行游戏辅助小工具的开发了,那种一万个挂机窗口最小化挂机的游戏,之前都只用到了后台键盘操作,这次终于用到后台鼠标操作了,然后ControlClick并不能满足要求,因为窗口在激活状态的时候,你的鼠标操作会导致ControlClick的坐标参数不能正确生效,我修改了我之前发布的文章,并提供了一个很麻瓜的解决方案(执行ControlClick相关代码前通过代码先一步将窗口最小化,实测有效)
这里提供一个不那么麻瓜的方案:(这也是关于SendMessage/PostMessage发送鼠标控制消息的一段示例代码)
global WM_MOUSEMOVE := 0x0200 ; 移动鼠标.
global WM_LBUTTONDOWN := 0x0201 ; 按下鼠标左键.
global WM_LBUTTONUP := 0x0202 ; 释放鼠标左键.
;单击鼠标左键,waId:窗口的ahk_id,_x:相对于窗口的横坐标,_y:相对于窗口的纵坐标,坐标可通过MouseGetPos获取,sync:同步/异步发送消息,默认同步
clickL(waId,_x,_y,sync:=1){
baseSendFun(WM_MOUSEMOVE,waId,_x,_y,sync)
baseSendFun(WM_LBUTTONDOWN,waId,_x,_y,sync)
baseSendFun(WM_LBUTTONUP,waId,_x,_y,sync)
}
baseSendFun(msgId,waId,p1,p2,sync:=1){
;msgbox %waId% , %msgId% , %p1% ,%p2%
if (!waId||!msgId){
return
}
lParam:=p1+(p2<<16)
if (sync){
SendMessage,msgId,0,lParam,, ahk_id %waId% ;此处的第二个参数0既wParam表示不依赖任何其他按键的状态,你有其他需求需要去查阅windows消息的API指南
}else{
PostMessage,msgId,0,lParam,, ahk_id %waId%
}
}
这个方案在窗口激活且你的鼠标在窗口中活动时依旧会影响代码的执行,但是当你停止动作的时候他就会自动恢复到正常运行的状态,因此你可以通过窗口&鼠标当前状态的判定来避免影响