You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
AutoHotInterception/AHK v2/Monitor.ahk

243 lines
6.1 KiB
Plaintext

/*
Script to show data flowing from Interception
*/
#SingleInstance force
Persistent
#include Lib\AutoHotInterception.ahk
OutputDebug("DBGVIEWCLEAR")
monitorGui := Gui("", "AutoHotInterception Monitor")
monitorGui.MarginX := 0
monitorGui.MarginY := 0
monitorGui.OnEvent("Close", GuiClosed)
DeviceList := {}
filterMouseMove := 1
filterKeyPress := 0
AHI := AutoHotInterception()
; Device List
DeviceList := AHI.GetDeviceList()
marginX := 10
marginY := 10
idW := 50 ; Width of the ID text
vhOff := 7 ; Width to space VIDPID / Handle above/below ID row
copyW := 40 ; Width of the Copy buttons
outputH := 350 ; Height of the Output boxes
rowH := 35 ; Distance between each row of devices
maxWidths := Map("K", 0, "M", 0) ; Max Width of device entries for each column
totalWidths := Map("K", 0, "M", 0) ; Total Width of each column
tW := Map("K", 0, "M", 0)
devTypes := ["K", "M"] ; Lookup table for device type
starts := Map("K", 0, "M", 10) ; Start IDs for each device type
columnTitles := Map("K", "Keyboards", "M", "Mice") ; Column Titles
columnX := Map("K", 0, "M", 0)
Loop 2 {
strings := Map()
devType := devTypes[A_Index]
columnX[devType] := GetColX(devType)
start := starts[devType]
UpdateWidth(0, 1) ; Reset max width
; Add device entries
Loop 10 {
i := start + A_Index
if (!DeviceList.Has(i)){
continue
}
dev := DeviceList[i]
rowY := (marginY * 3) + ((A_Index - 1) * rowH)
chkDevice := monitorGui.Add("Checkbox", "x" columnX[devType] " y" rowY " w" idW, "ID: " dev.id)
chkDevice.OnEvent("Click", CheckboxChanged.Bind(dev.id))
lowest := UpdateLowest(chkDevice)
strings[A_index] := {vid:FormatHex(dev.VID), pid: FormatHex(dev.PID), handle: dev.Handle}
textVidPid := monitorGui.Add("Text", "x" columnX[devType] + idW " y" rowY - vhOff, "VID / PID:`t0x" strings[A_index].vid ", 0x" strings[A_index].pid)
maxWidths[devType] := UpdateWidth(textVidPid)
textHandle := monitorGui.Add("Text", "x" columnX[devType] + idW " y" rowY + vhOff, "Handle:`t`t" StrReplace(strings[A_index].Handle, "&", "&&"))
maxWidths[devType] := UpdateWidth(textHandle)
}
; Add copy buttons
Loop 10 {
i := start + A_Index
if (!DeviceList.Has(i)){
continue
}
dev := DeviceList[i]
rowY := (marginY * 3) + ((A_Index - 1) * rowH)
xpos := columnX[devType] + idW + maxWidths[devType]
btnCopyVidPid := monitorGui.Add("Button", "x" xpos " y" rowY - vhOff " h14 w" copyW, "Copy")
btnCopyVidPid.OnEvent("Click", CopyClipboard.Bind("0x" strings[A_index].vid ", 0x" strings[A_index].pid))
btnCopyHandle := monitorGui.Add("Button", "x" xpos " y" rowY + vhOff " h14 w" copyW, "Copy")
btnCopyHandle.OnEvent("Click", CopyClipboard.Bind(strings[A_index].handle))
}
totalWidths[devType] := idW + maxWidths[devType] + copyW
monitorGui.Add("Text", "x" columnX[devType] " y5 w" totalWidths[devType] " Center", columnTitles[devType])
}
lowest += 2 * MarginY
; Options
chkFilterPress := monitorGui.Add("CheckBox", "x" columnX["K"] " y" lowest, "Only show key releases")
chkFilterPress.OnEvent("Click", FilterPress)
chkFilterMove := monitorGui.Add("CheckBox", "x" columnX["M"] " w" totalWidths[devType] " yp Checked", "Filter Movement (Warning: Turning off can cause crashes)")
chkFilterMove.OnEvent("Click", FilterMove)
lowest += 2 * MarginY
btnClearKeyboard := monitorGui.Add("Button", "x" columnX["K"] " y" lowest " w" totalWidths["K"] " Center", "Clear")
btnClearKeyboard.OnEvent("Click", ClearKeyboard)
btnClearMouse := monitorGui.Add("Button", "x" columnX["M"] " yp w" totalWidths["M"] " Center", "Clear")
btnClearMouse.OnEvent("Click", ClearMouse)
lowest += 30
; Output
lvKeyboard := monitorGui.Add("ListView", "x" columnX["K"] " y" lowest " w" totalWidths["K"] " h" outputH, ["ID", "Code", "State", "Key Name"])
lvKeyboard.ModifyCol(4, 100)
lvMouse := monitorGui.Add("ListView", "x" columnX["M"] " yp w" totalWidths["M"] " h" outputH, ["ID", "Code", "State", "X", "Y", "Info"])
lvMouse.ModifyCol(6, 200)
lowest += outputH
monitorGui.Show("w" (marginX * 3) + totalWidths["K"] + totalWidths["M"] " h" marginY + lowest)
return
GetColX(devType){
global marginX, idW, maxWidths, copyW
if (devType == "K")
return marginX
else
return (marginX * 2) + idW + maxWidths["K"] + copyW
}
UpdateLowest(ctrl){
static max := 0
ctrl.GetPos(&cpX, &cpY, &cpW, &cpH)
pos := cpY + cpH
if (pos > max){
max := pos
}
return max
}
UpdateWidth(ctrl, reset := 0){
static max := 0
if (reset){
max := 0
return
}
ctrl.GetPos(&cpX, &cpY, &cpW, &cpH)
if (cpW > max){
max := cpW
}
return max
}
CheckboxChanged(id, ctrl, info){
global AHI
if (ctrl.Value){
if (id < 11){
AHI.SubscribeKeyboard(id, false, KeyboardEvent.Bind(id))
} else {
AHI.SubscribeMouseButtons(id, false, MouseButtonEvent.Bind(id))
AHI.SubscribeMouseMoveRelative(id, false, MouseAxisEvent.Bind(id, "Relative Move"))
AHI.SubscribeMouseMoveAbsolute(id, false, MouseAxisEvent.Bind(id, "Absolute Move"))
}
} else {
if (id < 11){
AHI.UnsubscribeKeyboard(id)
} else {
AHI.UnsubscribeMouseButtons(id)
AHI.UnsubscribeMouseMoveRelative(id)
AHI.UnsubscribeMouseMoveAbsolute(id)
}
}
}
FilterMove(ctrl, info){
global filterMouseMove
filterMouseMove := ctrl.Value
}
FilterPress(ctrl, info){
global filterKeyPress
filterKeyPress := ctrl.Value
}
ClearKeyboard(ctrl, info){
global lvKeyboard
lvKeyboard.Delete()
}
ClearMouse(ctrl, info){
global lvMouse
lvMouse.Delete()
}
FormatHex(num){
return Format("{:04X}", num)
}
KeyboardEvent(id, code, state){
global lvKeyboard, filterKeyPress
if (filterKeyPress && state)
return
scanCode := Format("{:x}", code)
keyName := GetKeyName("SC" scanCode)
row := lvKeyboard.Add(, id, code, state, keyName)
lvKeyboard.Modify(row, "Vis")
}
MouseButtonEvent(id, code, state){
global lvMouse
row := lvMouse.Add(, id, code, state, "", "", "Button")
lvMouse.Modify(row, "Vis")
}
MouseAxisEvent(id, info, x, y){
global lvMouse, filterMouseMove
if (filterMouseMove)
return
row := lvMouse.Add(, id, "", "", x, y, info)
lvMouse.Modify(row, "Vis")
}
CopyClipboard(str, ctrl, info){
A_Clipboard := str
Tooltip("Copied to Clipboard")
SetTimer(ClearTooltip, 1000)
}
ClearTooltip(){
ToolTip
}
GuiClosed(gui){
ExitApp
}
^Esc::
{
ExitApp
}