调用Acc方法来实现,用于实时获取标准窗口中光标(光标可能是文本输入框中的闪烁光标)的位置,并显示在屏幕上的 ToolTip 提示框中。

 

Acc获取编辑光标位置.ahk

Plain text
复制到剪贴板
Open code in new window
EnlighterJS 3 Syntax Highlighter
CoordMode, ToolTip
Loop {
Sleep 200
GetCaret(x, y)
; ToolTip %x% %y% %A_CaretX%
ToolTip %x% %y%, 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}
}
CoordMode, ToolTip Loop { Sleep 200 GetCaret(x, y) ; ToolTip %x% %y% %A_CaretX% ToolTip %x% %y%, 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} }
CoordMode, ToolTip
Loop {
  Sleep 200
  GetCaret(x, y)
; 	ToolTip %x% %y% %A_CaretX%
  ToolTip %x% %y%, 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}
}

 

 

声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。