问题描述
我正在用 C++ 开发一个开源桌面应用程序,我需要在 C++ 代码中运行这个 AutoHotkey 脚本,我该怎么做?
Acc_Caret := Acc_ObjectFromWindow(WinExist("A"),OBJID_CARET := 0xFFFFFFF8)
Caret_Location := Acc_Location(Acc_Caret)
x = %A_CaretX%
y = %A_CaretY%
WinGetPos,Xc,Yc,A
msgBox,Act at %Xc%`,%Yc%
msgBox % Caret_Location.x "`n" Caret_Location.y
msgBox % x "`n" y
return
Acc_Init()
{
Static h
If Not h
h:=DllCall("LoadLibrary","Str","oleacc","Ptr")
}
Acc_ObjectFromWindow(hWnd,idobject = -4)
{
Acc_Init()
If DllCall("oleacc\AccessibleObjectFromWindow","Ptr",hWnd,"UInt",idobject&=0xFFFFFFFF,-VarSetCapacity(IID,16)+Numput(idobject==0xFFFFFFF0?0x46000000000000C0:0x719B3800AA000C81,Numput(idobject==0xFFFFFFF0?0x0000000000020400:0x11CF3C3D618736E0,IID,"Int64"),"Ptr*",pacc)=0
Return ComObjEnwrap(9,pacc,1)
}
Acc_Location(Acc,ChildId=0,byref Position="") { ; adapted from Sean's code
try Acc.acclocation(ComObj(0x4003,&x:=0),ComObj(0x4003,&y:=0),&w:=0),&h:=0),ChildId)
catch
return
Position := "x" NumGet(x,"int") " y" NumGet(y,"int") " w" NumGet(w,"int") " h" NumGet(h,"int")
return {x:NumGet(x,"int"),y:NumGet(y,w:NumGet(w,h:NumGet(h,"int")}
}
(msgBox 只是为了调试)
解决方法
看起来使用 dll 应该可以工作,请参阅 https://www.autohotkey.com/boards/viewtopic.php?t=34779&p=160687 也许您可以看到 this Ruby/Ahk 集成是如何工作的。