#SingleInstance Force #Persistent #NoEnv #NoTrayIcon ListLines Off SetBatchLines -1 { WM_ACTIVATE := 0x06 WM_KILLFOCUS := 0x08 WM_LBUTTONDOWN := 0x201 WM_LBUTTONUP := 0x202 global Border := new Outline, Stored:={}, Acc, ChildId, TVobj, Win:={} } { DetectHiddenWindows, On OnExit, OnExitCleanup OnMessage(0x200,"WM_MOUSEMOVE") ComObjError(false) Hotkey, ~LButton Up, Off } { Gui Main: New, HWNDhwnd LabelGui AlwaysOnTop, Accessible Info Viewer Gui Main: Default Win.Main := hwnd Gui, Add, Button, x160 y8 w105 h20 vShowStructure gShowStructure, Show Acc Structure { Gui, Add, Text, x10 y3 w25 h26 Border gCrossHair ReadOnly HWNDh8 Border CColor(h8, "White") Gui, Add, Text, x10 y3 w25 h4 HWNDh9 Border CColor(h9, "0046D5") Gui, Add, Text, x13 y17 w19 h1 Border vHBar Gui, Add, Text, x22 y8 w1 h19 Border vVBar } { Gui, Font, bold Gui, Add, GroupBox, x2 y32 w275 h130 vWinCtrl, Window/Control Info Gui, Font Gui, Add, Text, x7 y49 w42 h20 Right, WinTitle: Gui, Add, Edit, x51 y47 w221 h20 vWinTitle , Gui, Add, Text, x7 y71 w42 h20 Right, Text: Gui, Add, Edit, x51 y69 w221 h20 vText , Gui, Add, Text, x7 y93 w42 h20 Right, Hwnd: Gui, Add, Edit, x51 y91 w72 h20 vHwnd, Gui, Add, Text, x126 y93 w51 h20 vClassText Right, Class(NN): Gui, Add, Edit, x178 y91 w94 h20 vClass, Gui, Add, Text, x7 y115 w42 h20 Right, Position: Gui, Add, Edit, x51 y113 w72 h20 vPosition, Gui, Add, Text, x126 y115 w51 h20 Right, Process: Gui, Add, Edit, x178 y113 w94 h20 vProcess, Gui, Add, Text, x7 y137 w42 h20 Right, Size: Gui, Add, Edit, x51 y135 w72 h20 vSize, Gui, Add, Text, x126 y137 w51 h20 Right, Proc ID: Gui, Add, Edit, x178 y135 w94 h20 vProcID, } { Gui, Font, bold Gui, Add, GroupBox, x2 y165 w275 h240 vAcc, Accessible Info Gui, Font Gui, Add, Text, x7 y182 w42 h20 Right, Name: Gui, Add, Edit, x51 y180 w221 h20 vAccName , Gui, Add, Text, x7 y204 w42 h20 Right, Value: Gui, Add, Edit, x51 y202 w221 h20 vAccValue , Gui, Add, Text, x7 y226 w42 h20 Right, Role: Gui, Add, Edit, x51 y224 w72 h20 vAccRole, Gui, Add, Text, x126 y226 w55 h20 Right, ChildCount: Gui, Add, Edit, x182 y224 w90 h20 vAccChildCount, Gui, Add, Text, x7 y248 w42 h20 Right, State: Gui, Add, Edit, x51 y246 w72 h20 vAccState, Gui, Add, Text, x126 y248 w55 h20 Right, Selection: Gui, Add, Edit, x182 y246 w90 h20 vAccSelection, Gui, Add, Text, x7 y270 w42 h20 Right, Action: Gui, Add, Edit, x51 y268 w72 h20 vAccAction, Gui, Add, Text, x126 y270 w55 h20 Right, Focus: Gui, Add, Edit, x182 y268 w90 h20 vAccFocus, { Gui, Add, Text, x7 y292 w55 h20 Right vAccLocationText, Location: Gui, Add, Edit, x65 y290 w207 h20 vAccLocation , Gui, Add, Text, x7 y314 w55 h20 Right, Description: Gui, Add, Edit, x65 y312 w207 h20 vAccDescription , Gui, Add, Text, x7 y336 w55 h20 Right, Keyboard: Gui, Add, Edit, x65 y334 w207 h20 vAccKeyboard , Gui, Add, Text, x7 y358 w55 h20 Right, Help: Gui, Add, Edit, x65 y356 w207 h20 vAccHelp , Gui, Add, Text, x7 y380 w55 h20 Right, HelpTopic: Gui, Add, Edit, x65 y378 w207 h20 vAccHelpTopic , } } { Gui, Add, StatusBar, gShowMainGui SB_SetParts(70,150) SB_SetText("`tshow more", 3) } { Gui Acc: New, ToolWindow AlwaysOnTop Resize LabelAcc HWNDhwnd -DPIScale, Acc Structure Gui, Acc:+OwnerMain Win.Acc := hwnd Gui Acc: Add, TreeView, w200 h300 vTView gTreeView R17 AltSubmit Gui Acc: Show, Hide } GoSub, ShowMainGui WinSet, Redraw, , % "ahk_id" Win.Main param1 = %1% If param1 pObj := ComObjActive(param1) If pObj GetAccInfoRun() return } ShowMainGui: { if A_EventInfo in 1,2 { WM_MOUSEMOVE() StatusBarGetText, SB_Text, %A_EventInfo%, % "ahk_id" Win.Main if SB_Text if (A_EventInfo=2 and SB_Text:=SubStr(SB_Text,7)) or if RegExMatch(SB_Text, "Id: \K\d+", SB_Text) { ToolTip % "clipboard = " clipboard:=SB_Text SetTimer, RemoveToolTip, -2000 } } else { Gui Main: Default if ShowingLess { SB_SetText("`tshow less", 3) GuiControl, Move, Acc, x2 y165 w275 h240 GuiControl, Show, AccDescription GuiControl, Show, AccLocation GuiControl, Show, AccLocationText { height := 319 while height<428 { height += 10 Gui, Show, w280 h%height% Sleep, 20 } } Gui, Show, w280 h428 ShowingLess := false } else { if (ShowingLess != "") { height := 428 while height>319 { height -= 10 Gui, Show, w280 h%height% Sleep, 20 } } Gui, Show, w280 h319 GuiControl, Hide, AccDescription GuiControl, Hide, AccLocation GuiControl, Hide, AccLocationText GuiControl, Move, Acc, x2 y165 w275 h130 SB_SetText("`tshow more", 3) ShowingLess := true } WinSet, Redraw, , % "ahk_id" Win.Main } return } #if Not Lbutton_Pressed ^/:: { SetBatchLines, -1 Lbutton_Pressed := true Stored.Chwnd := "" Gui Acc: Default GuiControl, Disable, TView while, Lbutton_Pressed GetAccInfo() SetBatchLines, 10ms return } #if Lbutton_Pressed ^/:: { Lbutton_Pressed := false Gui Main: Default Sleep, -1 GuiControl, , WinCtrl, % (DllCall("GetParent", Uint,Acc_WindowFromObject(Acc))? "Control":"Window") " Info" if Not DllCall("IsWindowVisible", "Ptr",Win.Acc) { Border.Hide() SB_SetText("Path: " GetAccPath(Acc).path, 2) } else { Gui Acc: Default BuildTreeView() GuiControl, Enable, TView WinActivate, % "ahk_id" Win.Acc PostMessage, %WM_LBUTTONDOWN%, , , SysTreeView321, % "ahk_id" Win.Acc } return } #if ~Lbutton Up:: { Hotkey, ~LButton Up, Off Lbutton_Pressed := False Gui Main: Default if Not CH { GuiControl, Show, HBar GuiControl, Show, VBar CrossHair(CH:=true) } Sleep, -1 GuiControl, , WinCtrl, % (DllCall("GetParent", Uint,Acc_WindowFromObject(Acc))? "Control":"Window") " Info" if Not DllCall("IsWindowVisible", "Ptr",Win.Acc) { Border.Hide() SB_SetText("Path: " GetAccPath(Acc).path, 2) } else { Gui Acc: Default BuildTreeView() GuiControl, Enable, TView WinActivate, % "ahk_id" Win.Acc PostMessage, %WM_LBUTTONDOWN%, , , SysTreeView321, % "ahk_id" Win.Acc } return } CrossHair: { if (A_GuiEvent = "Normal") { SetBatchLines, -1 Hotkey, ~LButton Up, On { GuiControl, Hide, HBar GuiControl, Hide, VBar CrossHair(CH:=false) } Lbutton_Pressed := True Stored.Chwnd := "" Gui Acc: Default GuiControl, Disable, TView while, Lbutton_Pressed GetAccInfo() SetBatchLines, 10ms } return } OnExitCleanup: { CrossHair(true) GuiClose: ExitApp } ShowStructure: { ControlFocus, Static1, % "ahk_id" Win.Main if DllCall("IsWindowVisible", "Ptr",Win.Acc) { PostMessage, %WM_LBUTTONDOWN%, , , SysTreeView321, % "ahk_id" Win.Acc return } WinGetPos, x, y, w, , % "ahk_id" Win.Main WinGetPos, , , AccW, AccH, % "ahk_id" Win.Acc WinMove, % "ahk_id" Win.Acc, , (x+w+AccW > A_ScreenWidth? x-AccW-10:x+w+10) , % y+5, %AccW%, %AccH% WinShow, % "ahk_id" Win.Acc if ComObjType(Acc, "Name") = "IAccessible" BuildTreeView() if Lbutton_Pressed GuiControl, Disable, TView else GuiControl, Enable, TView PostMessage, %WM_LBUTTONDOWN%, , , SysTreeView321, % "ahk_id" Win.Acc return } BuildTreeView() { r := GetAccPath(Acc) AccObj:=r.AccObj, Child_Path:=r.Path, r:="" Gui Acc: Default TV_Delete() GuiControl, -Redraw, TView parent := TV_Add(Acc_Role(AccObj), "", "Bold Expand") TVobj := {(parent): {is_obj:true, obj:AccObj, need_children:false, childid:0, Children:[]}} Loop Parse, Child_Path, . { if A_LoopField is not Digit TVobj[parent].Obj_Path := Trim(TVobj[parent].Obj_Path "," A_LoopField, ",") else { StoreParent := parent parent := TV_BuildAccChildren(AccObj, parent, "", A_LoopField) TVobj[parent].need_children := false TV_Expanded(StoreParent) TV_Modify(parent,"Expand") AccObj := TVobj[parent].obj } } if Not ChildId { TV_BuildAccChildren(AccObj, parent) TV_Modify(parent, "Select") } else TV_BuildAccChildren(AccObj, parent, ChildId) TV_Expanded(parent) Sleep 100 TV_Modify(TV_GetSelection(),"Vis") GuiControl, +Redraw, TView } AccClose: { Border.Hide() Gui Acc: Hide TV_Delete() Gui Main: Default GuiControl, Enable, ShowStructure return } AccSize: { Anchor(TView, "wh") return } TreeView: { Gui, Submit, NoHide if (A_GuiEvent = "S") UpdateAccInfo(TVobj[A_EventInfo].obj, TVobj[A_EventInfo].childid, TVobj[A_EventInfo].obj_path) if (A_GuiEvent = "+") { GuiControl, -Redraw, TView TV_Expanded(A_EventInfo) GuiControl, +Redraw, TView } return } RemoveToolTip: { ToolTip return } GetAccInfoRun() { global Whwnd, pObj Acc := pObj.AccObj.AccObj ChildId := pObj.AccObj.Child Location := GetAccLocation(Acc, ChildId) Hwnd := Acc_WindowFromObject(Acc) if parent := DllCall("GetParent", Uint,hwnd) { WinGetTitle, title, ahk_id %parent% ControlGetText, text, , ahk_id %Hwnd% Whwnd := pObj.AccObj.WinID class := GetClassNN(Hwnd,Whwnd) ControlGetPos, posX, posY, posW, posH, , ahk_id %Hwnd% WinGet, proc, ProcessName, ahk_id %parent% WinGet, procid, PID, ahk_id %parent% } else { WinGetTitle, title, ahk_id %Hwnd% WinGetText, text, ahk_id %Hwnd% WinGetClass, class, ahk_id %Hwnd% WinGetPos, posX, posY, posW, posH, ahk_id %Hwnd% WinGet, proc, ProcessName, ahk_id %Hwnd% WinGet, procid, PID, ahk_id %Hwnd% } GuiControl, , WinTitle, %title% GuiControl, , Text, %text% SetFormat, IntegerFast, H GuiControl, , Hwnd, % Hwnd+0 SetFormat, IntegerFast, D GuiControl, , Class, %class% GuiControl, , Position, x%posX% y%posY% GuiControl, , Size, w%posW% h%posH% GuiControl, , Process, %proc% GuiControl, , ProcId, %procid% UpdateAccInfo(Acc, ChildId) SB_SetText("Path: " GetAccPath(Acc).path, 2) Gosub ShowMainGui Gosub ShowStructure } GetAccInfo() { global Whwnd static ShowButtonEnabled MouseGetPos, , , Whwnd if (Whwnd!=Win.Main and Whwnd!=Win.Acc) { { GuiControlGet, SectionLabel, , WinCtrl if (SectionLabel != "Window/Control Info") GuiControl, , WinCtrl, Window/Control Info } Acc := Acc_ObjectFromPoint(ChildId) Location := GetAccLocation(Acc, ChildId) if Stored.Location != Location { Hwnd := Acc_WindowFromObject(Acc) if Stored.Hwnd != Hwnd { if parent := DllCall("GetParent", Uint,hwnd) { WinGetTitle, title, ahk_id %parent% ControlGetText, text, , ahk_id %Hwnd% class := GetClassNN(Hwnd,Whwnd) ControlGetPos, posX, posY, posW, posH, , ahk_id %Hwnd% WinGet, proc, ProcessName, ahk_id %parent% WinGet, procid, PID, ahk_id %parent% } else { WinGetTitle, title, ahk_id %Hwnd% WinGetText, text, ahk_id %Hwnd% WinGetClass, class, ahk_id %Hwnd% WinGetPos, posX, posY, posW, posH, ahk_id %Hwnd% WinGet, proc, ProcessName, ahk_id %Hwnd% WinGet, procid, PID, ahk_id %Hwnd% } { GuiControl, , WinTitle, %title% GuiControl, , Text, %text% SetFormat, IntegerFast, H GuiControl, , Hwnd, % Hwnd+0 SetFormat, IntegerFast, D GuiControl, , Class, %class% GuiControl, , Position, x%posX% y%posY% GuiControl, , Size, w%posW% h%posH% GuiControl, , Process, %proc% GuiControl, , ProcId, %procid% } Stored.Hwnd := Hwnd } UpdateAccInfo(Acc, ChildId) } } } UpdateAccInfo(Acc, ChildId, Obj_Path="") { global Whwnd Gui Main: Default Location := GetAccLocation(Acc, ChildId, x,y,w,h) { GuiControl, , AccName, % Acc.accName(ChildId) GuiControl, , AccValue, % Acc.accValue(ChildId) GuiControl, , AccRole, % Acc_GetRoleText(Acc.accRole(ChildId)) GuiControl, , AccState, % Acc_GetStateText(Acc.accState(ChildId)) GuiControl, , AccAction, % Acc.accDefaultAction(ChildId) GuiControl, , AccChildCount, % ChildId? "N/A":Acc.accChildCount GuiControl, , AccSelection, % ChildId? "N/A":Acc.accSelection GuiControl, , AccFocus, % ChildId? "N/A":Acc.accFocus GuiControl, , AccLocation, %Location% GuiControl, , AccDescription, % Acc.accDescription(ChildId) GuiControl, , AccKeyboard, % Acc.accKeyboardShortCut(ChildId) Guicontrol, , AccHelp, % Acc.accHelp(ChildId) GuiControl, , AccHelpTopic, % Acc.accHelpTopic(ChildId) SB_SetText(ChildId? "Child Id: " ChildId:"Object") SB_SetText(DllCall("IsWindowVisible", "Ptr",Win.Acc)? "Path: " Obj_Path:"", 2) } Border.Transparent(true) Border.show(x,y,x+w,y+h) Border.setabove(Whwnd) Border.Transparent(false) Stored.Location := Location } GetClassNN(Chwnd, Whwnd) { global _GetClassNN := {} _GetClassNN.Hwnd := Chwnd Detect := A_DetectHiddenWindows WinGetClass, Class, ahk_id %Chwnd% _GetClassNN.Class := Class DetectHiddenWindows, On EnumAddress := RegisterCallback("GetClassNN_EnumChildProc") DllCall("EnumChildWindows", "uint",Whwnd, "uint",EnumAddress) DetectHiddenWindows, %Detect% return, _GetClassNN.ClassNN, _GetClassNN:="" } GetClassNN_EnumChildProc(hwnd, lparam) { static Occurrence global _GetClassNN WinGetClass, Class, ahk_id %hwnd% if _GetClassNN.Class == Class Occurrence++ if Not _GetClassNN.Hwnd == hwnd return true else { _GetClassNN.ClassNN := _GetClassNN.Class Occurrence Occurrence := 0 return false } } TV_Expanded(TVid) { For Each, TV_Child_ID in TVobj[TVid].Children if TVobj[TV_Child_ID].need_children TV_BuildAccChildren(TVobj[TV_Child_ID].obj, TV_Child_ID) } TV_BuildAccChildren(AccObj, Parent, Selected_Child="", Flag="") { TVobj[Parent].need_children := false Parent_Obj_Path := Trim(TVobj[Parent].Obj_Path, ",") for wach, child in Acc_Children(AccObj) { if Not IsObject(child) { added := TV_Add("[" A_Index "] " Acc_GetRoleText(AccObj.accRole(child)), Parent) TVobj[added] := {is_obj:false, obj:Acc, childid:child, Obj_Path:Parent_Obj_Path} if (child = Selected_Child) TV_Modify(added, "Select") } else { added := TV_Add("[" A_Index "] " Acc_Role(child), Parent, "bold") TVobj[added] := {is_obj:true, need_children:true, obj:child, childid:0, Children:[], Obj_Path:Trim(Parent_Obj_Path "," A_Index, ",")} } TVobj[Parent].Children.Insert(added) if (A_Index = Flag) Flagged_Child := added } return Flagged_Child } GetAccPath(Acc, byref hwnd="") { If !hwnd := Acc_WindowFromObject(Acc) return WinObj := Acc_ObjectFromWindow(hwnd) WinObjPos := Acc_Location(WinObj).pos while Acc_WindowFromObject(Parent:=Acc_Parent(Acc)) = hwnd { t2 := GetEnumIndex(Acc) "." t2 if Acc_Location(Parent).pos = WinObjPos return {AccObj:Parent, Path:SubStr(t2,1,-1)} Acc := Parent } while Acc_WindowFromObject(Parent:=Acc_Parent(WinObj)) = hwnd t1.="P.", WinObj:=Parent return {AccObj:Acc, Path:t1 SubStr(t2,1,-1)} } GetEnumIndex(Acc, ChildId=0) { if Not ChildId { ChildPos := Acc_Location(Acc).pos For Each, child in Acc_Children(Acc_Parent(Acc)) if IsObject(child) and Acc_Location(child).pos=ChildPos return A_Index } else { ChildPos := Acc_Location(Acc,ChildId).pos For Each, child in Acc_Children(Acc) if Not IsObject(child) and Acc_Location(Acc,child).pos=ChildPos return A_Index } } GetAccLocation(AccObj, Child=0, byref x="", byref y="", byref w="", byref h="") { AccObj.accLocation(ComObj(0x4003,&x:=0), ComObj(0x4003,&y:=0), ComObj(0x4003,&w:=0), ComObj(0x4003,&h:=0), Child) return "x" (x:=NumGet(x,0,"int")) " " . "y" (y:=NumGet(y,0,"int")) " " . "w" (w:=NumGet(w,0,"int")) " " . "h" (h:=NumGet(h,0,"int")) } WM_MOUSEMOVE() { static hCurs := new Cursor(32649) MouseGetPos,,,,ctrl if (ctrl = "msctls_statusbar321") DllCall("SetCursor","ptr",hCurs.ptr) } class Cursor { __New(id) { this.ptr := DllCall("LoadCursor","UInt",NULL,"Int",id,"UInt") } __delete() { DllCall("DestroyCursor","Uint",this.ptr) } } class Outline { __New(color="red") { Gui, +HWNDdefault Loop, 4 { Gui, New, -Caption +ToolWindow HWNDhwnd -DPIScale Gui, Color, %color% this[A_Index] := hwnd } this.visible := false this.color := color this.top := this[1] this.right := this[2] this.bottom := this[3] this.left := this[4] Gui, %default%: Default } Show(x1, y1, x2, y2, sides="TRBL") { Gui, +HWNDdefault if InStr( sides, "T" ) Gui, % this[1] ":Show", % "NA X" x1-2 " Y" y1-2 " W" x2-x1+4 " H" 2 Else, Gui, % this[1] ":Hide" if InStr( sides, "R" ) Gui, % this[2] ":Show", % "NA X" x2 " Y" y1 " W" 2 " H" y2-y1 Else, Gui, % this[2] ":Hide" if InStr( sides, "B" ) Gui, % this[3] ":Show", % "NA X" x1-2 " Y" y2 " W" x2-x1+4 " H" 2 Else, Gui, % this[3] ":Hide" if InStr( sides, "L" ) Gui, % this[4] ":Show", % "NA X" x1-2 " Y" y1 " W" 2 " H" y2-y1 Else, Gui, % this[3] ":Hide" self.visible := true Gui, %default%: Default } Hide() { Gui, +HWNDdefault Loop, 4 Gui, % this[A_Index] ": Hide" self.visible := false Gui, %default%: Default } SetAbove(hwnd) { ABOVE := DllCall("GetWindow", "uint", hwnd, "uint", 3) Loop, 4 DllCall( "SetWindowPos", "uint", this[A_Index], "uint", ABOVE , "int", 0, "int", 0, "int", 0, "int", 0 , "uint", 0x1|0x2|0x10 ) } Transparent(param) { Loop, 4 WinSet, Transparent, % param=1? 0:255, % "ahk_id" this[A_Index] self.visible := !param } Color(color) { Gui, +HWNDdefault Loop, 4 Gui, % this[A_Index] ": Color" , %color% self.color := color Gui, %default%: Default } Destroy() { Loop, 4 Gui, % this[A_Index] ": Destroy" } } CColor(Hwnd, Background="", Foreground="") { return CColor_(Background, Foreground, "", Hwnd+0) } CColor_(Wp, Lp, Msg, Hwnd) { static static WM_CTLCOLOREDIT=0x0133, WM_CTLCOLORLISTBOX=0x134, WM_CTLCOLORSTATIC=0x0138 ,LVM_SETBKCOLOR=0x1001, LVM_SETTEXTCOLOR=0x1024, LVM_SETTEXTBKCOLOR=0x1026, TVM_SETTEXTCOLOR=0x111E, TVM_SETBKCOLOR=0x111D ,BS_CHECKBOX=2, BS_RADIOBUTTON=8, ES_READONLY=0x800 ,CLR_NONE=-1, CSILVER=0xC0C0C0, CGRAY=0x808080, CWHITE=0xFFFFFF, CMAROON=0x80, CRED=0x0FF, CPURPLE=0x800080, CFUCHSIA=0xFF00FF,CGREEN=0x8000, CLIME=0xFF00, COLIVE=0x8080, CYELLOW=0xFFFF, CNAVY=0x800000, CBLUE=0xFF0000, CTEAL=0x808000, CAQUA=0xFFFF00 ,CLASSES := "Button,ComboBox,Edit,ListBox,Static,RICHEDIT50W,SysListView32,SysTreeView32" If (Msg = "") { if !adrSetTextColor adrSetTextColor := DllCall("GetProcAddress", "uint", DllCall("GetModuleHandle", "str", "Gdi32.dll"), "str", "SetTextColor") ,adrSetBkColor := DllCall("GetProcAddress", "uint", DllCall("GetModuleHandle", "str", "Gdi32.dll"), "str", "SetBkColor") ,adrSetBkMode := DllCall("GetProcAddress", "uint", DllCall("GetModuleHandle", "str", "Gdi32.dll"), "str", "SetBkMode") BG := !Wp ? "" : C%Wp% != "" ? C%Wp% : "0x" SubStr(WP,5,2) SubStr(WP,3,2) SubStr(WP,1,2) FG := !Lp ? "" : C%Lp% != "" ? C%Lp% : "0x" SubStr(LP,5,2) SubStr(LP,3,2) SubStr(LP,1,2) WinGetClass, class, ahk_id %Hwnd% If class not in %CLASSES% return A_ThisFunc "> Unsupported control class: " class ControlGet, style, Style, , , ahk_id %Hwnd% if (class = "Edit") && (Style & ES_READONLY) class := "Static" if (class = "Button") if (style & BS_RADIOBUTTON) || (style & BS_CHECKBOX) class := "Static" else return A_ThisFunc "> Unsupported control class: " class if (class = "ComboBox") { VarSetCapacity(CBBINFO, 52, 0), NumPut(52, CBBINFO), DllCall("GetComboBoxInfo", "UInt", Hwnd, "UInt", &CBBINFO) hwnd := NumGet(CBBINFO, 48) %hwnd%BG := BG, %hwnd%FG := FG, %hwnd% := BG ? DllCall("CreateSolidBrush", "UInt", BG) : -1 IfEqual, CTLCOLORLISTBOX,,SetEnv, CTLCOLORLISTBOX, % OnMessage(WM_CTLCOLORLISTBOX, A_ThisFunc) If NumGet(CBBINFO,44) Hwnd := Numget(CBBINFO,44), class := "Edit" } if class in SysListView32,SysTreeView32 { m := class="SysListView32" ? "LVM" : "TVM" SendMessage, %m%_SETBKCOLOR, ,BG, ,ahk_id %Hwnd% SendMessage, %m%_SETTEXTCOLOR, ,FG, ,ahk_id %Hwnd% SendMessage, %m%_SETTEXTBKCOLOR, ,CLR_NONE, ,ahk_id %Hwnd% return } if (class = "RICHEDIT50W") return f := "RichEdit_SetBgColor", %f%(Hwnd, -BG) if (!CTLCOLOR%Class%) CTLCOLOR%Class% := OnMessage(WM_CTLCOLOR%Class%, A_ThisFunc) return %Hwnd% := BG ? DllCall("CreateSolidBrush", "UInt", BG) : CLR_NONE, %Hwnd%BG := BG, %Hwnd%FG := FG } critical Hwnd := Lp + 0, hDC := Wp + 0 If (%Hwnd%) { DllCall(adrSetBkMode, "uint", hDC, "int", 1) if (%Hwnd%FG) DllCall(adrSetTextColor, "UInt", hDC, "UInt", %Hwnd%FG) if (%Hwnd%BG) DllCall(adrSetBkColor, "UInt", hDC, "UInt", %Hwnd%BG) return (%Hwnd%) } } CrossHair(OnOff=1) { static AndMask, XorMask, $, h_cursor, IDC_CROSS := 32515 ,c0,c1,c2,c3,c4,c5,c6,c7,c8,c9,c10,c11,c12,c13 , b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13 , h1,h2,h3,h4,h5,h6,h7,h8,h9,h10,h11,h12,h13 if (OnOff = "Init" or OnOff = "I" or $ = "") { $ := "h" , VarSetCapacity( h_cursor,4444, 1 ) , VarSetCapacity( AndMask, 32*4, 0xFF ) , VarSetCapacity( XorMask, 32*4, 0 ) , system_cursors := "32512,32513,32514,32515,32516,32642,32643,32644,32645,32646,32648,32649,32650" StringSplit c, system_cursors, `, Loop, %c0% h_cursor := DllCall( "LoadCursor", "uint",0, "uint",c%A_Index% ) , h%A_Index% := DllCall( "CopyImage", "uint",h_cursor, "uint",2, "int",0, "int",0, "uint",0 ) , b%A_Index% := DllCall("LoadCursor", "Uint", "", "Int", IDC_CROSS, "Uint") } $ := (OnOff = 0 || OnOff = "Off" || $ = "h" && (OnOff < 0 || OnOff = "Toggle" || OnOff = "T")) ? "b" : "h" Loop, %c0% h_cursor := DllCall( "CopyImage", "uint",%$%%A_Index%, "uint",2, "int",0, "int",0, "uint",0 ) , DllCall( "SetSystemCursor", "uint",h_cursor, "uint",c%A_Index% ) } { ; Acc Library Acc_Init() { Static h If Not h h:=DllCall("LoadLibrary","Str","oleacc","Ptr") } Acc_ObjectFromEvent(ByRef _idChild_, hWnd, idObject, idChild) { Acc_Init() If DllCall("oleacc\AccessibleObjectFromEvent", "Ptr", hWnd, "UInt", idObject, "UInt", idChild, "Ptr*", pacc, "Ptr", VarSetCapacity(varChild,8+2*A_PtrSize,0)*0+&varChild)=0 Return ComObjEnwrap(9,pacc,1), _idChild_:=NumGet(varChild,8,"UInt") } Acc_ObjectFromPoint(ByRef _idChild_ = "", x = "", y = "") { Acc_Init() If DllCall("oleacc\AccessibleObjectFromPoint", "Int64", x==""||y==""?0*DllCall("GetCursorPos","Int64*",pt)+pt:x&0xFFFFFFFF|y<<32, "Ptr*", pacc, "Ptr", VarSetCapacity(varChild,8+2*A_PtrSize,0)*0+&varChild)=0 Return ComObjEnwrap(9,pacc,1), _idChild_:=NumGet(varChild,8,"UInt") } Acc_ObjectFromWindow(hWnd, idObject = 0) { Acc_Init() 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) } Acc_WindowFromObject(pacc) { If DllCall("oleacc\WindowFromAccessibleObject", "Ptr", IsObject(pacc)?ComObjValue(pacc):pacc, "Ptr*", hWnd)=0 Return hWnd } Acc_GetRoleText(nRole) { nSize := DllCall("oleacc\GetRoleText", "Uint", nRole, "Ptr", 0, "Uint", 0) VarSetCapacity(sRole, (A_IsUnicode?2:1)*nSize) DllCall("oleacc\GetRoleText", "Uint", nRole, "str", sRole, "Uint", nSize+1) Return sRole } Acc_GetStateText(nState) { nSize := DllCall("oleacc\GetStateText", "Uint", nState, "Ptr", 0, "Uint", 0) VarSetCapacity(sState, (A_IsUnicode?2:1)*nSize) DllCall("oleacc\GetStateText", "Uint", nState, "str", sState, "Uint", nSize+1) Return sState } Acc_Role(Acc, ChildId=0) { try return ComObjType(Acc,"Name")="IAccessible"?Acc_GetRoleText(Acc.accRole(ChildId)):"invalid object" } Acc_State(Acc, ChildId=0) { try return ComObjType(Acc,"Name")="IAccessible"?Acc_GetStateText(Acc.accState(ChildId)):"invalid object" } Acc_Children(Acc) { if ComObjType(Acc,"Name")!="IAccessible" error_message := "Cause:`tInvalid IAccessible Object`n`n" else { Acc_Init() cChildren:=Acc.accChildCount, Children:=[] if DllCall("oleacc\AccessibleChildren", "Ptr", ComObjValue(Acc), "Int", 0, "Int", cChildren, "Ptr", VarSetCapacity(varChildren,cChildren*(8+2*A_PtrSize),0)*0+&varChildren, "Int*", cChildren)=0 { Loop %cChildren% i:=(A_Index-1)*(A_PtrSize*2+8)+8, child:=NumGet(varChildren,i), Children.Insert(NumGet(varChildren,i-8)=3?child:Acc_Query(child)), ObjRelease(child) return Children } } error:=Exception("",-1) MsgBox, 262148, Acc_Children Failed, % (error_message?error_message:"") "File:`t" (error.file==A_ScriptFullPath?A_ScriptName:error.file) "`nLine:`t" error.line "`n`nContinue Script?" IfMsgBox, No ExitApp } Acc_Location(Acc, ChildId=0) { try Acc.accLocation(ComObj(0x4003,&x:=0), ComObj(0x4003,&y:=0), ComObj(0x4003,&w:=0), ComObj(0x4003,&h:=0), ChildId) catch return return {x:NumGet(x,0,"int"), y:NumGet(y,0,"int"), w:NumGet(w,0,"int"), h:NumGet(h,0,"int") , pos:"x" NumGet(x,0,"int")" y" NumGet(y,0,"int") " w" NumGet(w,0,"int") " h" NumGet(h,0,"int")} } Acc_Parent(Acc) { try parent:=Acc.accParent return parent?Acc_Query(parent): } Acc_Child(Acc, ChildId=0) { try child:=Acc.accChild(ChildId) return child?Acc_Query(child): } Acc_Query(Acc) { try return ComObj(9, ComObjQuery(Acc,"{618736e0-3c3d-11cf-810c-00aa00389b71}"), 1) } } Anchor(i, a = "", r = false) { static c, cs = 12, cx = 255, cl = 0, g, gs = 8, gl = 0, gpi, gw, gh, z = 0, k = 0xffff, ptr If z = 0 VarSetCapacity(g, gs * 99, 0), VarSetCapacity(c, cs * cx, 0), ptr := A_PtrSize ? "Ptr" : "UInt", z := true If (!WinExist("ahk_id" . i)) { GuiControlGet, t, Hwnd, %i% If ErrorLevel = 0 i := t Else ControlGet, i, Hwnd, , %i% } VarSetCapacity(gi, 68, 0), DllCall("GetWindowInfo", "UInt", gp := DllCall("GetParent", "UInt", i), ptr, &gi) , giw := NumGet(gi, 28, "Int") - NumGet(gi, 20, "Int"), gih := NumGet(gi, 32, "Int") - NumGet(gi, 24, "Int") If (gp != gpi) { gpi := gp Loop, %gl% If (NumGet(g, cb := gs * (A_Index - 1)) == gp, "UInt") { gw := NumGet(g, cb + 4, "Short"), gh := NumGet(g, cb + 6, "Short"), gf := 1 Break } If (!gf) NumPut(gp, g, gl, "UInt"), NumPut(gw := giw, g, gl + 4, "Short"), NumPut(gh := gih, g, gl + 6, "Short"), gl += gs } ControlGetPos, dx, dy, dw, dh, , ahk_id %i% Loop, %cl% If (NumGet(c, cb := cs * (A_Index - 1), "UInt") == i) { If a = { cf = 1 Break } giw -= gw, gih -= gh, as := 1, dx := NumGet(c, cb + 4, "Short"), dy := NumGet(c, cb + 6, "Short") , cw := dw, dw := NumGet(c, cb + 8, "Short"), ch := dh, dh := NumGet(c, cb + 10, "Short") Loop, Parse, a, xywh If A_Index > 1 av := SubStr(a, as, 1), as += 1 + StrLen(A_LoopField) , d%av% += (InStr("yh", av) ? gih : giw) * (A_LoopField + 0 ? A_LoopField : 1) DllCall("SetWindowPos", "UInt", i, "UInt", 0, "Int", dx, "Int", dy , "Int", InStr(a, "w") ? dw : cw, "Int", InStr(a, "h") ? dh : ch, "Int", 4) If r != 0 DllCall("RedrawWindow", "UInt", i, "UInt", 0, "UInt", 0, "UInt", 0x0101) Return } If cf != 1 cb := cl, cl += cs bx := NumGet(gi, 48, "UInt"), by := NumGet(gi, 16, "Int") - NumGet(gi, 8, "Int") - gih - NumGet(gi, 52, "UInt") If cf = 1 dw -= giw - gw, dh -= gih - gh NumPut(i, c, cb, "UInt"), NumPut(dx - bx, c, cb + 4, "Short"), NumPut(dy - by, c, cb + 6, "Short") , NumPut(dw, c, cb + 8, "Short"), NumPut(dh, c, cb + 10, "Short") Return, true }