获取光标位置的多种方法和用途-MouseGetPos/A_Caret/ACC/AccessibleObjectFromWindow

方法一:

autohotkey提供了内置变量A_CaretX和A_CaretY,指示当前光标(文本插入点)的X和Y坐标。如果没有使用 CoordMode 使得坐标相对于整个屏幕, 默认坐标相对于活动窗口. 如果没有活动窗口或无法确定文本插入点的位置, 则这两个变量为空。

用法:

#Persistent
SetTimer, WatchCaret, 100
return
WatchCaret:
  ToolTip, X%A_CaretX% Y%A_CaretY%, A_CaretX, A_CaretY - 20
return

方法二:

autohtokey提供了内置指令MouseGetPos,获取鼠标光标的当前位置以及鼠标当前悬停的窗口和控件(可选的)。

用法:

#Persistent
SetTimer, WatchCursor, 100
return

WatchCursor:
MouseGetPos,xpos ,ypos , id, control
WinGetTitle, title, ahk_id %id%
WinGetClass, class, ahk_id %id%
ToolTip,在x:%xpos% y:%ypos%的控件 `n ahk_id %id%`nahk_class %class%`n%title%`nControl: %control%
return

方法三:

使用acc活取光标位置,来至飞跃搜集整理。

loop {
	Sleep, 200
	GetCaret(x, y)
	ToolTip %x% %y%
}

Esc::ExitApp


;======== 获取光标位置的函数 =========


; 获取光标位置(坐标相对于屏幕)
; From Acc.ahk by Sean, jethrow, malcev, FeiYue
GetCaret(Byref CaretX="", Byref CaretY="")
{
	static init
	CoordMode, Caret, Screen
	CaretX:=A_CaretX, CaretY:=A_CaretY
	if (!CaretX or !CaretY)
		Try {
			if (!init)
				init:=DllCall("LoadLibrary","Str","oleacc","Ptr")
	VarSetCapacity(IID,16), idObject:=OBJID_CARET:=0xFFFFFFF8
		, NumPut(idObject==0xFFFFFFF0?0x0000000000020400:0x11CF3C3D618736E0, IID, "Int64")
		, NumPut(idObject==0xFFFFFFF0?0x46000000000000C0:0x719B3800AA000C81, IID, 8, "Int64")
	if DllCall("oleacc\AccessibleObjectFromWindow"
		, "Ptr",WinExist("A"), "UInt",idObject, "Ptr",&IID, "Ptr*",pacc)=0
	{
		Acc:=ComObject(9,pacc,1), ObjAddRef(pacc)
			, Acc.accLocation(ComObj(0x4003,&x:=0), ComObj(0x4003,&y:=0)
			, ComObj(0x4003,&w:=0), ComObj(0x4003,&h:=0), ChildId:=0)
			, CaretX:=NumGet(x,0,"int"), CaretY:=NumGet(y,0,"int")
	}
}
return {x:CaretX, y:CaretY}
}

分析比较:

三种方法的分析比较,第一种方法使用最为便捷,在鼠标和光标同时存在的时候指示的是光标的位置,没有光标的时候指示的是鼠标位置,第二种方法,功能性有一定的增加,可以获取鼠标所在位置的控件的信息,同时获取鼠标所在的位置,在一定的条件下是不错的选择。第三种方法是调用系统动态的链接库进行查找光标的位置,在方法一和方法二都无效的时候,方法三将是一种非常好的一种办法获取光标位置。

问题一:那具体的有哪些情况下方法一和方法二不好用呢?

据我测试有以下情况:

  • 非标控件,如QQ、部分浏览器等
  • 部分绿色软件

问题二:是不是方法三在任何情况下都好用?

  • 并不是的,在部分绿色软件下,不好用,可能是部分绿色软件做了防获取的措施。

给TA捐赠
共{{data.count}}人
人已捐赠
其他案例

;徐晓亮的文件管理规范和相关的AutoHotkey脚本源代码2019年11月18日.ahk

2019-11-18 18:30:26

其他

关键字搜索demo

2019-11-23 15:35:03

8 条回复 A文章作者 M管理员
  1. 尖尖大魔王

    方法三 居然在 vs和explorer.exe 里获取不到!!!
    还有这个要怎么转C++ 找了好久 终于找到一个可以在浏览器里获取光标的方法了

  2. autokey

    新手感谢分享?

  3. LionAHK1

    不错 ,使用也很简单 .

  4. wolai

    A_CaretX和A_CaretY 在Intellij的软件里都不能用怎么办?

    • wolai

      第三中非法也不行

  5. 麻花藤

    哈哈哈哈,我测了几小时要疯了。原来使用范围有局限性:

    方法一 : 方法二 : 备注
    VS ✖ ✖
    VSCode ✖ ✖
    网页-输入框 ✔ ✔ (无坐标)
    网页-页面 ✖ ✔
    记事本 ✔ ✔ (有坐标)

    方法三看起不环保,不用。

  6. 麻花藤

    哈哈哈哈,我测了几小时要疯了。原来使用范围有局限性:

    …………………… 方法一…………方法二 ……… 备注
    VS ……………….. ✖………………… ✖
    VSCode……….. ✖…………………. ✖
    网页-输入框 …..✔………………… ✔……… (无坐标)
    网页-页面……… ✖………………… ✔
    记事本…………… ✔………………… ✔ ……….(有坐标)

    方法三看起不环保,不用。

  7. ahkjoo

    想要通过光标位置来获取 wintitle怎么办? 不是鼠标位置.

个人中心
购物车
优惠劵
有新私信 私信列表
搜索