Files
Echo/Echo.ahk
2021-10-27 13:56:06 +02:00

132 lines
3.0 KiB
AutoHotkey

#NoEnv
#Warn
SendMode Input
SetWorkingDir %A_ScriptDir%
#SingleInstance force
#Persistent
ih := InputHook("B")
ih.KeyOpt("{All}", "NV")
ih.OnKeyDown := Func("OnKeyDown")
ih.OnKeyUp := Func("OnKeyUp")
ih.Start()
global enabledWindows := Array()
enabledWindows.Push(Array())
enabledWindows.Push(Array())
OnKeyDown(InputHook, VK, SC) {
key := GetKeyName(Format("vk{:x}sc{:x}", VK, SC))
for k, v in enabledWindows[1] {
ControlSend,, {%key% down}, ahk_pid %v%
}
; ControlSend,, v, ahk_pid 16736
; Tooltip, %key%
}
OnKeyUp(InputHook, VK, SC) {
key := GetKeyName(Format("vk{:x}sc{:x}", VK, SC))
for k, v in enabledWindows[1] {
ControlSend,, {%key% up}, ahk_pid %v%
}
}
WinGetAll() {
PIDs := Array()
winTitles := Array()
output := Array()
WinGet, all, list
Loop, %all%
{
WinGet, PID, PID, % "ahk_id " all%A_Index%
WinGetTitle, WTitle, % "ahk_id " all%A_Index%
if (WTitle != "") {
PIDs.Push(PID)
winTitles.Push(WTitle)
}
}
output.Push(PIDs)
output.Push(winTitles)
return output
}
AllWindowsToString() {
allWindows := WinGetAll()
output := ""
for k, v in allWindows[1] {
output .= allWindows[1][k]
output .= ", "
output .= allWindows[2][k]
output .= "|"
}
StringTrimRight, output, output, 1
return output
}
HasVal(arr, val) {
for k, v in arr {
if (v == val) {
return k
}
}
return 0
}
EnableWindows(istring) {
while (enabledWindows.Length() > 0) {
enabledWindows.Pop()
}
enabledWindows.Push(Array())
enabledWindows.Push(Array())
if (InStr(istring, "|") == 0) {
ostring := StrSplit(istring, ", ")
if (!HasVal(enabledWindows[1], (ostring[1]))) {
enabledWindows[1].Push(ostring[1])
enabledWindows[2].Push(ostring[2])
}
} else {
ostring := StrSplit(istring, "|")
for k, v in ostring {
ostring2 := StrSplit(v, ", ")
if (!HasVal(enabledWindows[1], (ostring2[1]))) {
enabledWindows[1].Push(ostring2[1])
enabledWindows[2].Push(ostring2[2])
}
}
}
; TODO: Remove all non selected windows
}
GuiSelectActiveWindows(allWindows) {
output := Array()
for k, v in allWindows[1] {
if (HasVal(enabledWindows[1], "" v)) {
; GuiControl, Choose, WindowListGUI, k
output.Push(k)
}
}
return output
}
MakeUI() {
Gui, Destroy
string := AllWindowsToString()
Gui, Add, ListBox, Multi w500 vWindowListGUI r10, %string%
Gui, Add, Button, Default, OK
Gui, Show
for k, v in GuiSelectActiveWindows(WinGetAll()) {
; See what's wrong with choose, maybe it doesn't like to be called many times though just that is being done on forum guy
GuiControl, Choose, WindowListGUI, v
}
}
F3::
MakeUI()
return
ButtonOK:
Gui, Submit
EnableWindows(WindowListGUI)
return
F5::reload