Compare commits

...

8 Commits

Author SHA1 Message Date
f6bb50438d Implement core functionality in ahk2 2025-01-01 01:00:49 +01:00
59b8ab5e57 Refactor more shit to be more sensible 2025-01-01 00:49:44 +01:00
e9a0313de6 Rework a good part of echo to ahk2 2025-01-01 00:34:36 +01:00
715ddfa24d Update 2024-08-24 19:41:37 +02:00
unknown
999531d2ab Remove keybind conflict 2022-01-10 20:06:24 +01:00
unknown
e028a339a2 Fix typo 2022-01-10 20:05:51 +01:00
unknown
ed246a7b02 Keys now added and removed via F3 and F4 respectively 2022-01-10 20:05:09 +01:00
PhatDave
f7bd71453c Now uses window ID instead of PID 2021-11-03 09:58:06 +01:00
4 changed files with 325 additions and 403 deletions

367
Echo.ahk
View File

@@ -1,367 +0,0 @@
#NoEnv
#Warn
SendMode Input
SetWorkingDir %A_ScriptDir%
#SingleInstance force
#Persistent
SetKeyDelay, 0
SetControlDelay, 100
ih := InputHook("B")
ih.KeyOpt("{All}", "NV")
ih.OnKeyDown := Func("OnKeyDown")
ih.OnKeyUp := Func("OnKeyUp")
ih.Start()
global addNext := 0
global removeNext := 0
global enabledWindows := Array()
enabledWindows.Push(Array())
enabledWindows.Push(Array())
global keyLog := Array()
global whitelistKeys := Array()
global paused := 0
SetTimer, ResetHook, -60000
OnKeyDown(InputHook, VK, SC) {
if (!paused) {
key := GetKeyName(Format("vk{:x}sc{:x}", VK, SC))
if (addNext) {
if (!whitelistKeys.HasKey(Key)) {
whitelistKeys[key] := 1
sstring := "Added "
sstring .= key
ShowTooltip(sstring)
addNext := 0
} else {
sstring := "Key already exists"
ShowTooltip(sstring)
addNext := 0
}
return
}
if (removeNext) {
if (whitelistKeys.HasKey(Key)) {
whitelistKeys.Remove(key)
sstring := "Removed "
sstring .= key
ShowTooltip(sstring)
removeNext := 0
} else {
sstring := "Key not found"
ShowTooltip(sstring)
removeNext := 0
}
return
}
if (whitelistKeys.HasKey(key)) {
for k, v in enabledWindows[1] {
ControlSend,, {%key% down}, ahk_pid %v%
}
}
if (!keyLog.HasKey(key)) {
keyLog[key] := SC,
}
}
}
OnKeyUp(InputHook, VK, SC) {
if (!paused) {
key := GetKeyName(Format("vk{:x}sc{:x}", VK, SC))
if (whitelistKeys.HasKey(key)) {
for k, v in enabledWindows[1] {
ControlSend,, {%key% up}, ahk_pid %v%
}
}
}
}
ShowTooltip(text) {
ToolTip, %text%
SetTimer, RemoveToolTip, -800
}
RemoveToolTip:
ToolTip
return
; Not really mine at all
SortArray(Array, Order="A") {
;Order A: Ascending, D: Descending, R: Reverse
MaxIndex := ObjMaxIndex(Array)
If (Order = "R") {
count := 0
Loop, % MaxIndex
ObjInsert(Array, ObjRemove(Array, MaxIndex - count++))
Return
}
Partitions := "|" ObjMinIndex(Array) "," MaxIndex
Loop {
comma := InStr(this_partition := SubStr(Partitions, InStr(Partitions, "|", False, 0)+1), ",")
spos := pivot := SubStr(this_partition, 1, comma-1) , epos := SubStr(this_partition, comma+1)
if (Order = "A") {
Loop, % epos - spos {
if (Array[pivot] > Array[A_Index+spos])
ObjInsert(Array, pivot++, ObjRemove(Array, A_Index+spos))
}
} else {
Loop, % epos - spos {
if (Array[pivot] < Array[A_Index+spos])
ObjInsert(Array, pivot++, ObjRemove(Array, A_Index+spos))
}
}
Partitions := SubStr(Partitions, 1, InStr(Partitions, "|", False, 0)-1)
if (pivot - spos) > 1 ;if more than one elements
Partitions .= "|" spos "," pivot-1 ;the left partition
if (epos - pivot) > 1 ;if more than one elements
Partitions .= "|" pivot+1 "," epos ;the right partition
} Until !Partitions
}
WinGetAll() {
PIDs := Array()
winTitles := Array()
output := Array()
WinGet, all, list
Loop, %all%
{
WinGet, PID, PID, % "ahk_id " all%A_Index%
WinGet, name, ProcessName, % "ahk_id " all%A_Index%
if (name != "") {
PIDs.Push(PID)
winTitles.Push(name)
}
}
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
}
Find(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 (!Find(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 (!Find(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 (Find(enabledWindows[1], "" v)) {
; GuiControl, Choose, WindowListGUI, k
output.Push(k)
}
}
return output
}
MakeUI() {
Gui, Destroy
string := AllWindowsToString()
Gui, Add, ListBox, Multi h600 w800 vWindowListGUI, %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
}
}
KeyLogToString() {
output := ""
for k, v in keyLog {
output .= k
output .= "|"
}
StringTrimRight, output, output, 1
return output
}
WhitelistButtonUI() {
Gui, Destroy
SortArray(keyLog)
string := KeyLogToString()
Gui, Add, ListBox, Multi h600 w800 vKeyLogUI, %string%
Gui, Add, Button, Default, Save
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
}
}
WhitelistKeys(string) {
whitelistKeys := Array()
for k, v in StrSplit(string, "|") {
whitelistKeys[v] := 1
}
}
AddCurrentWindow() {
WinGet, activePID, PID, A
if (!Find(enabledWindows[1], activePID)) {
WinGet, activeName, ProcessName, A
enabledWindows[1].Insert(activePID)
enabledWindows[2].Insert(activeName)
sstring := "Added "
sstring .= activePID
sstring .= " ("
sstring .= activeName
sstring .= ") to echo list"
ShowTooltip(sstring)
}
}
RemoveCurrentWindow() {
WinGet, activePID, PID, A
if (Find(enabledWindows[1], activePID)) {
WinGet, activeName, ProcessName, A
enabledWindows[1].RemoveAt(Find(enabledWindows[1], activePID))
enabledWindows[2].RemoveAt(Find(enabledWindows[2], activeName))
sstring := "Removed "
sstring .= activePID
sstring .= " ("
sstring .= activeName
sstring .= ") from echo list"
ShowTooltip(sstring)
}
}
ResetHook:
ih.Stop()
ih := InputHook("B")
ih.KeyOpt("{All}", "NV")
ih.OnKeyDown := Func("OnKeyDown")
ih.OnKeyUp := Func("OnKeyUp")
ih.Start()
; Tooltip, WIN
SetTimer, ResetHook, -30000
return
TogglePause() {
if (paused) {
ShowTooltip("Unpaused")
paused := 0
return
}
ShowTooltip("Paused")
paused := 1
return
}
F5::
ih.Stop()
ih := InputHook("B")
ih.KeyOpt("{All}", "NV")
ih.OnKeyDown := Func("OnKeyDown")
ih.OnKeyUp := Func("OnKeyUp")
ih.Start()
return
F3::
MakeUI()
return
^!A::
ShowTooltip("Adding key")
addNext := 1
return
^!S::
ShowTooltip("Adding window")
AddCurrentWindow()
return
^!D::
ShowTooltip("Removing window")
RemoveCurrentWindow()
return
^!R::
ShowTooltip("Removing key")
removeNext := 1
return
F4::
WhitelistButtonUI()
return
F6::
TogglePause()
return
F7::
whitelistKeys["q"] := 1
whitelistKeys["e"] := 1
whitelistKeys[1] := 1
whitelistKeys[2] := 1
whitelistKeys[3] := 1
whitelistKeys[4] := 1
whitelistKeys[5] := 1
whitelistKeys["LShift"] := 1
whitelistKeys["LControl"] := 1
whitelistKeys["g"] := 1
whitelistKeys["v"] := 1
whitelistKeys["r"] := 1
whitelistKeys["f"] := 1
whitelistKeys["c"] := 1
whitelistKeys["y"] := 1
return
ButtonSave:
Gui, Submit
WhitelistKeys(KeyLogUI)
return
ButtonOK:
Gui, Submit
EnableWindows(WindowListGUI)
return
; F5::reload

280
Echo.ahk2 Normal file
View File

@@ -0,0 +1,280 @@
SendMode("Input")
SetWorkingDir(A_ScriptDir)
SetKeyDelay(0)
SetControlDelay(0)
ih := InputHook("B")
ih.KeyOpt("{All}", "NV")
ih.OnKeyDown := OnKeyDown
ih.OnKeyUp := OnKeyUp
ih.Start()
addNext := 0
removeNext := 0
enabledWindows := Map()
keyLog := Map()
whitelistedKeys := Map()
paused := 0
SetTimer(ResetHook, -60000)
OnKeyDown(InputHook, VK, SC) {
global paused, addNext, removeNext, enabledWindows, keyLog, whitelistedKeys
if (paused) {
return
}
hexVK := Format("{:X}", VK)
hexSC := Format("{:X}", SC)
key := GetKeyName("vk" . hexVK . "sc" . hexSC)
if (addNext) {
addNext := 0
if (whitelistedKeys.Has(key)) {
ToolTip("Key already exists")
SetTimer(ToolTip, -500)
return
}
whitelistedKeys.Set(key, 1)
ToolTip("Added " . key)
SetTimer(ToolTip, -500)
return
}
if (removeNext) {
removeNext := 0
if (!whitelistedKeys.Has(key)) {
ToolTip("Key not found")
SetTimer(ToolTip, -500)
return
}
whitelistedKeys.Delete(key)
ToolTip("Removed " . key)
SetTimer(ToolTip, -500)
return
}
if (whitelistedKeys.Has(key)) {
for hwnd, windowName in enabledWindows {
ControlSend("{" . key . " down}",, "ahk_id " . hwnd)
}
}
if (!keyLog.Has(key)) {
keyLog.Set(key, SC)
}
}
OnKeyUp(InputHook, VK, SC) {
global paused, whitelistedKeys, enabledWindows
if (paused) {
return
}
hexVK := Format("{:X}", VK)
hexSC := Format("{:X}", SC)
key := GetKeyName("vk" . hexVK . "sc" . hexSC)
if (whitelistedKeys.Has(key)) {
for hwnd, windowName in enabledWindows {
ControlSend("{" . key . " up}",, "ahk_id " . hwnd)
}
}
}
WinGetAll() {
PIDs := []
winTitles := []
all := WinGetList()
for window in all {
PID := WinGetPID("ahk_id " . window)
name := WinGetProcessName("ahk_id " . window)
if (name != "") {
PIDs.Push(PID)
winTitles.Push(name)
}
}
return [PIDs, winTitles]
}
AllWindowsToString() {
allWindows := WinGetAll()
output := ""
for k, v in allWindows[1] {
output .= allWindows[1][k] . ", " . allWindows[2][k] . "|"
}
return SubStr(output, 1, -1)
}
Find(arr, val) {
for k, v in arr {
if (v = val) {
return k
}
}
return 0
}
EnableWindows(istring) {
enabledWindows[1].Clear()
enabledWindows[2].Clear()
if (!InStr(istring, "|")) {
ostring := StrSplit(istring, ", ")
if (Find(enabledWindows[1], ostring[1]) = 0) {
enabledWindows[1].Push(ostring[1])
enabledWindows[2].Push(ostring[2])
}
} else {
ostring := StrSplit(istring, "|")
for v in ostring {
ostring2 := StrSplit(v, ", ")
if (Find(enabledWindows[1], ostring2[1]) = 0) {
enabledWindows[1].Push(ostring2[1])
enabledWindows[2].Push(ostring2[2])
}
}
}
}
GuiSelectActiveWindows(allWindows) {
output := []
for k, v in allWindows[1] {
if (Find(enabledWindows[1], v) != 0) {
output.Push(k)
}
}
return output
}
MakeUI() {
Gui := Gui()
Gui.Destroy()
string := AllWindowsToString()
Gui.Add("ListBox", "Multi w800 h600 vWindowListGUI", string)
Gui.Add("Button", "Default", "OK")
Gui.Show()
selections := GuiSelectActiveWindows(WinGetAll())
for k in selections {
Gui.Window.ListBox("WindowListGUI").Selected(k, true)
}
}
KeyLogToString() {
output := ""
for key in keyLog {
output .= key . "|"
}
return SubStr(output, 1, -1)
}
WhitelistButtonUI() {
Gui := Gui()
Gui.Destroy()
string := KeyLogToString()
Gui.Add("ListBox", "Multi w800 h600 vKeyLogUI", string)
Gui.Add("Button", "Default", "Save")
Gui.Show()
selections := GuiSelectActiveWindows(WinGetAll())
for k in selections {
Gui.Window.ListBox("KeyLogUI").Selected(k, true)
}
}
WhitelistKeys(string) {
whitelistKeys := Map()
for key in StrSplit(string, "|") {
whitelistKeys.Set(key, 1)
}
}
ResetHook() {
global ih
ih.Stop()
ih := InputHook("B")
ih.KeyOpt("{All}", "NV")
ih.OnKeyDown := OnKeyDown
ih.OnKeyUp := OnKeyUp
ih.Start()
SetTimer(ResetHook, -30000)
}
TogglePause() {
global paused
if (paused) {
ToolTip("Unpaused")
SetTimer(ToolTip, -500)
paused := 0
return
}
ToolTip("Paused")
SetTimer(ToolTip, -500)
paused := 1
return
}
F5:: {
global ih
Reload
; ih.Stop()
; ih := InputHook("B")
; ih.KeyOpt("{All}", "NV")
; ih.OnKeyDown := OnKeyDown
; ih.OnKeyUp := OnKeyUp
; ih.Start()
}
F3:: {
global addNext
ToolTip("Adding key")
SetTimer(ToolTip, -500)
addNext := 1
}
F4:: {
global removeNext
ToolTip("Removing key")
SetTimer(ToolTip, -500)
removeNext := 1
}
^!Y:: {
global enabledWindows
ToolTip("Adding window")
SetTimer(ToolTip, -500)
activeID := WinGetID("A")
if (enabledWindows.Has(activeID)) {
ToolTip("Window already in echo list")
SetTimer(ToolTip, -500)
return
}
activeName := WinGetProcessName("A")
enabledWindows.Set(activeID, activeName)
ToolTip("Added " . activeID . " (" . activeName . ") to echo list")
SetTimer(ToolTip, -500)
return
}
^!C:: {
global enabledWindows
ToolTip("Removing window")
SetTimer(ToolTip, -500)
activeID := WinGetID("A")
if (!enabledWindows.Has(activeID)) {
ToolTip("Window not found in echo list")
SetTimer(ToolTip, -500)
return
}
activeName := enabledWindows[activeID]
enabledWindows.Delete(activeID)
ToolTip("Removed " . activeID . " (" . activeName . ") from echo list")
SetTimer(ToolTip, -500)
return
}
F6:: TogglePause()
ButtonSave() {
Gui := Gui()
Gui.Submit()
WhitelistKeys(Gui.Control("KeyLogUI").Value)
}
ButtonOK() {
Gui := Gui()
Gui.Submit()
EnableWindows(Gui.Control("WindowListGUI").Value)
}

9
MouseTest.ahk Normal file
View File

@@ -0,0 +1,9 @@
#NoEnv
SetBatchLines, -1
#InstallMouseHook
; Mouse button event handlers
~LButton::
MouseGetPos, xpos, ypos
ToolTip, %xpos% %ypos%
return

View File

@@ -1,37 +1,37 @@
# Echoes keyboard events to selectable windows
Mainly used (and made) for World of Warcraft but it might have it's other uses
F3 brings up UI which allows the user to select 1 or more applications to echo **all** keyboard events to
In the current state ALL events are echoed, ~~customizability is planned~~
## 1.1.x
Keys can now be whitelisted and only whitelisted keys will be echoed
The whitelist menu can be accessed by pressing F4 and only keys pressed since the start of the program will be shown, user can then pick as many as they please to whitelist and only those the user picks will be echoed to other windows
## 1.1.2
Keys can now be whitelisted by using hotkeys
Pressing
`Ctrl + Alt + A`
Will add the next hit key to the whitelist
`Ctrl + Alt + R`
Will remove the next hit key from the whitelist
## 1.1.3
Windows can now be added to the echo list using `Ctrl+Alt+S` and `Ctrl+Alt+D` where S adds the **current** window and D removes the **current** window
## 1.1.4
For some reason the keyboard hook sometimes gives up
# Echoes keyboard events to selectable windows
Mainly used (and made) for World of Warcraft but it might have it's other uses
F3 brings up UI which allows the user to select 1 or more applications to echo **all** keyboard events to
In the current state ALL events are echoed, ~~customizability is planned~~
## 1.1.x
Keys can now be whitelisted and only whitelisted keys will be echoed
The whitelist menu can be accessed by pressing F4 and only keys pressed since the start of the program will be shown, user can then pick as many as they please to whitelist and only those the user picks will be echoed to other windows
## 1.1.2
Keys can now be whitelisted by using hotkeys
Pressing
`Ctrl + Alt + A`
Will add the next hit key to the whitelist
`Ctrl + Alt + R`
Will remove the next hit key from the whitelist
## 1.1.3
Windows can now be added to the echo list using `Ctrl+Alt+S` and `Ctrl+Alt+D` where S adds the **current** window and D removes the **current** window
## 1.1.4
For some reason the keyboard hook sometimes gives up
Added option to re-hook keyboard on `F5`