Created
July 2, 2019 09:54
-
-
Save manavortex/b0f9169651a451bbfbfe78e3c9b4ce46 to your computer and use it in GitHub Desktop.
a resizable version of Accessible Info Viewer
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
; 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