-
Notifications
You must be signed in to change notification settings - Fork 3
/
_HostControlWrapper.ahk
143 lines (143 loc) · 4.42 KB
/
_HostControlWrapper.ahk
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
Class _HostControlWrapper {
; static COMPATIBLE_CLASSES := "Edit"
static COMPATIBLE_CLASSES := "Edit|RICHEDIT50W"
instances := []
lastFound := 0x0
lastFoundValue := ""
_notify := false
notify {
set {
value:=!!value
OnMessage(0x8003, this, value), OnMessage(0x8004, this, value)
return this._notify:=value
}
get {
return this._notify
}
}
wrap(_hControlAsDigit, _cb:="") {
local
_detectHiddenWindows := A_DetectHiddenWindows
DetectHiddenWindows, On
WinGetClass, _class, % "ahk_id " . _hControlAsDigit
DetectHiddenWindows % _detectHiddenWindows
if not (_class ~= "^(" . this.COMPATIBLE_CLASSES . ")$") {
throw Exception("The host control either does not exist or is not a representative of the class " . this.COMPATIBLE_CLASSES . ".", -1, _class)
; return false
}
if (this.instances.hasKey(_hControlAsDigit)) {
throw Exception("Could not wrap the control (the control is already interfaced).", -1, _hControlAsDigit)
; return false
}
this.instances[_hControlAsDigit] := _class
_hwnd := ""
try {
ControlGetFocus, _focusedControl, A
ControlGet, _hwnd, Hwnd,, % _focusedControl, A
} catch
return true
if (_hwnd = _hControlAsDigit)
this.lastFound := _hControlAsDigit, (_cb && _cb.call(_hControlAsDigit))
return true
}
unwrap(_hControlAsDigit, _cb:="") {
this.instances[_hControlAsDigit] := ""
this.instances.delete(_hControlAsDigit), (_cb && _cb.call())
}
unwrapAll() {
local
for _hControlAsDigit in this.instances.clone()
this.unwrap(_hControlAsDigit)
}
_dispose() {
this.notify := false
this.__focus := this.__value := ""
}
__Delete() {
; MsgBox % A_ThisFunc
}
__Call(_callee, _params*) {
local
if (IsFunc(this.base.__Class "._" _callee)) {
_toggle := this.notify
this.notify := false
this["_" . _callee](_params*)
sleep, 10 ; <<<<
this.notify := _toggle
}
}
_sendText(_text) {
this._send("{Text}" . _text)
}
_send(_keys) {
local
sleep, 1 ; <<<<
ControlFocus,, % "ahk_id " . this.lastFound
_keyDelay := A_KeyDelay
SetKeyDelay, 0
SendInput, % _keys
SetKeyDelay % _keyDelay
}
getCaretPos(ByRef _atWordBufferPos:="", ByRef _startPos:="", ByRef _endPos:="") {
local
_startPos := _endPos := "", this._getCaretPos(_startPos, _endPos)
if (IsByref(_atWordBufferPos)) {
_atWordBufferPos := this._isAtWordBufferPos(_startPos, _endPos)
}
return _endPos
}
_getCaretPos(ByRef _startPos:="", ByRef _endPos:="") {
local
static EM_GETSEL := 0xB0
VarSetCapacity(_startPos, 4, 0), VarSetCapacity(_endPos, 4, 0)
SendMessage, % EM_GETSEL, &_startPos, &_endPos,, % "ahk_id " . this.lastFound
return _endPos := NumGet(_endPos), (IsByref(_startPos) && _startPos := NumGet(_startPos))
}
_isAtWordBufferPos(_startPos, _endPos) {
return ((_startPos = _endPos) && (StrLen(RegExReplace(SubStr(this.lastFoundValue, _endPos, 2), "\s$")) <= 1))
}
_getTextFromEvent(ByRef _text, _eventParam1, _eventParam2) {
local
static OBJID_CLIENT := 0xFFFFFFFC
_acc := this._Utils.Acc.ObjectFromEvent(_idChild_, _eventParam1, OBJID_CLIENT, _eventParam2)
try _text := _acc.accValue(0)
catch
_text := ""
}
call(_param1, _param2, _msg, _hwnd) {
local
static EVENT_FOCUS := 0x8003
static EVENT_VALUE := 0x8004
Critical
if (_msg = EVENT_VALUE) {
if (this.instances.hasKey(_param1)) {
_text := "", this._getTextFromEvent(_text, _param1, _param2)
try this.lastFoundValue := _text
this.__value.call()
}
} else if (_msg = EVENT_FOCUS) {
this.__focus.call(this.lastFound:=this.instances.hasKey(_param1) * _param1, _param2)
}
}
Class _Utils {
Class Acc {
Init() {
static _h := ""
IfNotEqual, _h,, return
_h := DllCall("Kernel32.dll\LoadLibrary", "Str", "Oleacc.dll", "UPtr")
}
ObjectFromEvent(ByRef _idChild_, _hWnd, _idObject, _idChild) {
local
static VT_DISPATCH := 9
static S_OK := 0x00
this.Init(), _pAcc := ""
_hResult := DllCall("Oleacc.dll\AccessibleObjectFromEvent"
, "Ptr", _hWnd, "UInt", _idObject, "UInt", _idChild, "PtrP", _pAcc, "Ptr", VarSetCapacity(_varChild, 8 + 2 * A_PtrSize, 0) * 0 + &_varChild)
if (_hResult = 0)
return ComObj(VT_DISPATCH, _pAcc, 1), _idChild_ := NumGet(_varChild, 8, "UInt")
}
}
}
#Include %A_LineFile%\..\_HostControlWrapper.Complete.ahk
#Include %A_LineFile%\..\_HostControlWrapper.EventsMessenger.ahk
}