WM_CHAR может обрабатываться независимо от активности поля ввода, наличие каретки способом по ссылке можно определить не везде:
F11::
SendMessage, WM_CHAR := 0x102, Asc("a"), (GetKeySC("a") << 16) | 1,, A
ResWM_CHAR := ErrorLevel
AccObj := AccObjectFromWindow(WinExist("A"), OBJID_CARET := 0xFFFFFFF8)
oLocation := AccLocation(AccObj)
ToolTip % "координаты каретки: x = " oLocation.x ", y = " oLocation.y "`nResWM_CHAR = " ResWM_CHAR ; если 0 значит обработано
Return
AccInit()
{
Static h
If Not h
h:=DllCall("LoadLibrary","Str","oleacc","Ptr")
}
AccObjectFromWindow(hWnd, idObject = 0)
{
AccInit()
If DllCall("oleacc\AccessibleObjectFromWindow", "Ptr", hWnd, "UInt", idObject&=0xFFFFFFFF
, "Ptr", -VarSetCapacity(IID,16)+NumPut(idObject==0xFFFFFFF0?0x46000000000000C0:0x719B3800AA000C81
,NumPut(idObject==0xFFFFFFF0?0x0000000000020400:0x11CF3C3D618736E0,IID,"Int64"),"Int64"), "Ptr*", pacc)=0
Return ComObjEnwrap(9,pacc,1)
}
AccLocation(Acc, ChildId=0, byref Position="")
{
try Acc.accLocation(ComObj(0x4003,&x:=0), ComObj(0x4003,&y:=0), ComObj(0x4003,&w:=0), ComObj(0x4003,&h:=0), ChildId)
catch
return
Position := "x" NumGet(x,0,"int") " y" NumGet(y,0,"int") " w" NumGet(w,0,"int") " h" NumGet(h,0,"int")
return {x:NumGet(x,0,"int"), y:NumGet(y,0,"int"), w:NumGet(w,0,"int"), h:NumGet(h,0,"int")}
}