Skip to content

Instantly share code, notes, and snippets.

@manavortex
Created July 2, 2019 09:54
Show Gist options
  • Save manavortex/7853e65337899823adb53b778d897da9 to your computer and use it in GitHub Desktop.
Save manavortex/7853e65337899823adb53b778d897da9 to your computer and use it in GitHub Desktop.
a resizable version of Accessible Info Viewer
; Accessible Info Viewer
; http://www.autohotkey.com/board/topic/77888-accessible-info-viewer-alpha-release-2012-09-20/
; https://dl.dropbox.com/u/47573473/Accessible%20Info%20Viewer/AccViewer%20Source.ahk
#SingleInstance force
_colTextW := 55
_col2W := 120
_col4W := 51
_margin := 10
_offset1 := _margin
_offset2 := _colTextW + 2*_margin ; 2 times the margin
_offset3 := _offset2 + _col2W + _margin
_offset4 := _offset3 + _colTextW + _margin
_fullW := _offset4 + _col4W - (_margin/2)
_guiWidth := _fullW + _fullW/2.5
_guiHeight := 410
_maxHeight := _guiHeight + 80
_minHeight := _guiHeight - 80
{
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 w%_colTextW% h26 Border gCrossHair ReadOnly HWNDh8 Border
CColor(h8, "White")
Gui, Add, Text, x10 y3 w%_colTextW% 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 w%_fullW% h130 vWinCtrl, Window/Control Info
Gui, Font
Gui, Add, Text, x%_offset1% y49 w%_colTextW% h20 Right, WinTitle:
Gui, Add, Edit, x%_offset2% y47 w%_fullW% h20 vWinTitle ,
Gui, Add, Text, x%_offset1% y71 w%_colTextW% h20 Right, Text:
Gui, Add, Edit, x%_offset2% y69 w%_fullW% h20 vText ,
; Row 3
Gui, Add, Text, x%_offset1% y93 w%_colTextW% h20 Right, Hwnd:
Gui, Add, Edit, x%_offset2% y91 w%_col2W% h20 vHwnd,
Gui, Add, Text, x%_offset3% y93 w%_colTextW% h20 vClassText Right, Class(NN):
Gui, Add, Edit, x%_offset4% y91 w%_col2W% h20 vClass,
; Row 4
Gui, Add, Text, x%_offset1% y115 w%_colTextW% h20 Right, Position:
Gui, Add, Edit, x%_offset2% y113 w%_col2W% h20 vPosition,
Gui, Add, Text, x%_offset3% y115 w%_colTextW% h20 Right, Process:
Gui, Add, Edit, x%_offset4% y113 w%_col2W% h20 vProcess,
; Row 5
Gui, Add, Text, x%_offset1% y137 w%_colTextW% h20 Right, Size:
Gui, Add, Edit, x%_offset2% y135 w%_col2W% h20 vSize,
Gui, Add, Text, x%_offset3% y137 w%_colTextW% h20 Right, Proc ID:
Gui, Add, Edit, x%_offset4% y135 w%_col2W% h20 vProcID,
}
{
Gui, Font, bold
Gui, Add, GroupBox, x2 y165 w525 h240 vAcc, Accessible Info
Gui, Font
Gui, Add, Text, x%_offset1% y182 w%_colTextW% h20 Right, Name:
Gui, Add, Edit, x%_offset2% y180 w%_fullW% h20 vAccName ,
Gui, Add, Text, x%_offset1% y204 w%_colTextW% h20 Right, Value:
Gui, Add, Edit, x%_offset2% y202 w%_fullW% h20 vAccValue ,
; Row 3
Gui, Add, Text, x%_offset1% y226 w%_colTextW% h20 Right, Role:
Gui, Add, Edit, x%_offset2% y224 w%_col2W% h20 vAccRole,
Gui, Add, Text, x%_offset3% y226 w%_colTextW% h20 Right, ChildCount:
Gui, Add, Edit, x%_offset4% y224 w%_col2W% h20 vAccChildCount,
; Row 4
Gui, Add, Text, x%_offset1% y248 w%_colTextW% h20 Right, State:
Gui, Add, Edit, x%_offset2% y246 w%_col2W% h20 vAccState,
Gui, Add, Text, x%_offset3% y248 w%_colTextW% h20 Right, Selection:
Gui, Add, Edit, x%_offset4% y246 w%_col2W% h20 vAccSelection,
; Row 5
Gui, Add, Text, x%_offset1% y270 w%_colTextW% h20 Right, Action:
Gui, Add, Edit, x%_offset2% y268 w%_col2W% h20 vAccAction,
Gui, Add, Text, x%_offset3% y270 w%_colTextW% h20 Right, Focus:
Gui, Add, Edit, x%_offset4% y268 w%_col2W% h20 vAccFocus,
{
Gui, Add, Text, x%_offset1% y292 w%_colTextW% h20 Right vAccLocationText, Location:
Gui, Add, Edit, x%_offset2% y290 w%_fullW% h20 vAccLocation ,
Gui, Add, Text, x%_offset1% y314 w%_colTextW% h20 Right, Description:
Gui, Add, Edit, x%_offset2% y312 w%_fullW% h20 vAccDescription ,
Gui, Add, Text, x%_offset1% y336 w%_colTextW% h20 Right, Keyboard:
Gui, Add, Edit, x%_offset2% y334 w%_fullW% h20 vAccKeyboard ,
Gui, Add, Text, x%_offset1% y358 w%_colTextW% h20 Right, Help:
Gui, Add, Edit, x%_offset2% y356 w%_fullW% h20 vAccHelp ,
Gui, Add, Text, x%_offset1% y380 w%_colTextW% h20 Right, HelpTopic:
Gui, Add, Edit, x%_offset2% y378 w%_fullW% h20 vAccHelpTopic ,
}
}
{
Gui, Add, StatusBar, gShowMainGui
SB_SetParts(70,150)
SB_SetText("`tshow more", 3)
}
{
Gui Acc: New, ToolWindow AlwaysOnTop Resize LabelAcc HWNDhwnd, Acc Structure
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
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 := _guiHeight
while height < _maxHeight {
height += 10
Gui, Show, w%_guiWidth% h%height%
Sleep, 20
}
}
Gui, Show, w%_guiWidth% h%_maxHeight%
ShowingLess := false
}
else {
if (ShowingLess != "") {
height := %_maxHeight%
while height > %_minHeight% {
height -= 10
Gui, Show, w%_guiWidth% h%height%
Sleep, 20
}
}
Gui, Show, w%_guiWidth% h%_minHeight%
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)
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
}
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 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="") {
hwnd := Acc_WindowFromObject(Acc)
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
Gui, Color, w%_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" , w%_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:0x%_offset1%19B3800AA000C81,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
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment