From 2b9598c84fc73aecb2ebd6b0a5cf572db8b917a0 Mon Sep 17 00:00:00 2001 From: Ben Reaves Date: Mon, 15 Jun 2020 01:15:01 -0500 Subject: [PATCH] - Completed Windows autoset keyboard feature --- setup.py | 2 ++ windows/detectUSB.ahk | 40 ++++++++++++++++++------ windows/kinto.ahk | 44 +++++++++++++++++++++++++++ windows/usb.vbs | 71 +++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 147 insertions(+), 10 deletions(-) create mode 100644 windows/usb.vbs diff --git a/setup.py b/setup.py index 1cb6016..53956f3 100755 --- a/setup.py +++ b/setup.py @@ -37,6 +37,8 @@ def windows_setup(): if(stvscode): os.system('perl -pi -e "s/(; )(.*)(; ST2CODE)/$2$3/g" ./windows/kinto-new.ahk') os.system('copy /Y ' + path + '\\windows\\kinto-start.vbs "%userprofile%\\.kinto\\kinto-start.vbs"') + os.system('copy /Y ' + path + '\\windows\\usb.vbs "%userprofile%\\.kinto\\usb.vbs"') + os.system('copy /Y ' + path + '\\windows\\usb.vbs "%userprofile%\\.kinto\\detectUSB.vbs"') os.system('mklink "%userprofile%\\Start Menu\\Programs\\Startup\\kinto-start.vbs" "%userprofile%\\.kinto\\kinto-start.vbs"') os.system('cp '+ path + '\\windows\\NoShell.vbs "%userprofile%\\.kinto\\NoShell.vbs"') os.system('cp '+ path + '\\windows\\toggle_kb.bat "%userprofile%\\.kinto\\toggle_kb.bat"') diff --git a/windows/detectUSB.ahk b/windows/detectUSB.ahk index 0775e17..f09c33f 100644 --- a/windows/detectUSB.ahk +++ b/windows/detectUSB.ahk @@ -1,19 +1,39 @@ #SingleInstance, force +#NoTrayIcon OnMessage(0x219, "notify_change") Return -lastnotify := 0 +lastkb = "" + +DllCall("AllocConsole") +WinHide % "ahk_id " DllCall("GetConsoleWindow", "ptr") notify_change(wParam, lParam, msg, hwnd) { - global lastnotify - T = %A_Now% - T -= 19700101000000,seconds - Tdiff := T - Tdiff -= lastnotify - if Tdiff > 5 + global lastkb + ; kbtype = % ComObjCreate("WScript.Shell").Exec("cscript /nologo usb.vbs").StdOut.ReadAll() + DetectHiddenWindows On + Run %ComSpec%,, Hide, pid + WinWait ahk_pid %pid% + DllCall("AttachConsole", "UInt", pid) + WshShell := ComObjCreate("Wscript.Shell") + exec := WshShell.Exec("cscript /nologo usb.vbs") + kbtype := exec.StdOut.ReadAll() + DllCall("FreeConsole") + Process Close, %pid% + if lastkb != %kbtype% { - MsgBox % Tdiff + + if InStr(kbtype, "Apple") + { + ; MsgBox, Apple + Run, %A_ScriptDir%\NoShell.vbs %A_ScriptDir%\toggle_kb.bat mac, %A_ScriptDir% + } + else{ + ; MsgBox, Windows + Run, %A_ScriptDir%\NoShell.vbs %A_ScriptDir%\toggle_kb.bat win, %A_ScriptDir% + } + ; MsgBox % kbtype } - lastnotify := T -} \ No newline at end of file + lastkb = %kbtype% +} diff --git a/windows/kinto.ahk b/windows/kinto.ahk index c75f2cd..374e950 100644 --- a/windows/kinto.ahk +++ b/windows/kinto.ahk @@ -2,6 +2,9 @@ #NoEnv #Persistent +DetectHiddenWindows, On +Run, %A_ScriptDir%\detectUSB.ahk + I_Icon = %A_ScriptDir%\assets\kinto-white.ico IfExist, %I_Icon% Menu, Tray, Icon, %I_Icon% @@ -44,9 +47,50 @@ tray_suspend(){ } Exit() { + IfWinExist, detectUSB.ahk + WinClose + ExitApp } +OnMessage(0x219, "notify_change") +return + +lastkb = "" + +DllCall("AllocConsole") +WinHide % "ahk_id " DllCall("GetConsoleWindow", "ptr") + +notify_change(wParam, lParam, msg, hwnd) +{ + global lastkb + ; kbtype = % ComObjCreate("WScript.Shell").Exec("cscript /nologo usb.vbs").StdOut.ReadAll() + DetectHiddenWindows On + Run %ComSpec%,, Hide, pid + WinWait ahk_pid %pid% + DllCall("AttachConsole", "UInt", pid) + WshShell := ComObjCreate("Wscript.Shell") + exec := WshShell.Exec("cscript /nologo usb.vbs") + kbtype := exec.StdOut.ReadAll() + DllCall("FreeConsole") + Process Close, %pid% + if lastkb != %kbtype% + { + + if InStr(kbtype, "Apple") + { + ; MsgBox, Apple + Run, %A_ScriptDir%\NoShell.vbs %A_ScriptDir%\toggle_kb.bat mac, %A_ScriptDir% + } + else{ + ; MsgBox, Windows + Run, %A_ScriptDir%\NoShell.vbs %A_ScriptDir%\toggle_kb.bat win, %A_ScriptDir% + } + ; MsgBox % kbtype + } + lastkb = %kbtype% +} + SetTitleMatchMode, 2 GroupAdd, terminals, ahk_exe ubuntu.exe diff --git a/windows/usb.vbs b/windows/usb.vbs new file mode 100644 index 0000000..ab0cdef --- /dev/null +++ b/windows/usb.vbs @@ -0,0 +1,71 @@ +Option Explicit +Dim oWMISrv, collDvcs, iUSBDvc , iDvc, sDvcID, sPID, sVID + +' add item to array +Function AddItem(arr, val) + ReDim Preserve arr(UBound(arr) + 1) + arr(UBound(arr)) = val + AddItem = arr +End Function + +' returns an array of the unique items in for-each-able collection fex +Function uniqFE(fex) + Dim dicTemp : Set dicTemp = CreateObject("Scripting.Dictionary") + Dim xItem + For Each xItem In fex + dicTemp(xItem) = 0 + Next + uniqFE = dicTemp.Keys() +End Function + +Function ReplaceX(ByVal sValue, ByVal sPattern, ByVal sNValue) + Dim oReg : Set oReg = New RegExp + oReg.Pattern = sPattern + ReplaceX = oReg.Replace(sValue, sNValue) + Set oReg = Nothing +End Function + +Set oWMISrv = GetObject("winmgmts:\\.\root\cimv2") +Set collDvcs = oWMISrv.ExecQuery("Select * From Win32_PnPEntity WHERE Service='kbdhid'") + +Dim deviceVID : deviceVID=Array() +Dim devicePID : devicePID=Array() +Dim deviceDesc : deviceDesc=Array() +Dim counter: counter=0 + +For Each iUSBDvc In collDvcs + sVID = ReplaceX(iUSBDvc.DeviceID, ".*VID_(.{4}).*", "$1") + sPID = ReplaceX(iUSBDvc.DeviceID, ".*PID_(.{4}).*", "$1") + deviceVID = AddItem(deviceVID, sVID) + devicePID = AddItem(devicePID, sPID) + deviceDesc = AddItem(deviceDesc, iUSBDvc.Description) + counter = counter + 1 + ' Wscript.Echo "Name : "& iUSBDvc.Description &"VID_PID : "& sVID & sPID + Next + +Dim uniqueVID: uniqueVID = uniqFE(deviceVID) +Dim vcount: vcount = UBound(uniqueVID) + 1 +Dim nonApple: nonApple = 0 +Dim i + +If vcount = 1 Then + If StrComp(deviceVID(0), "05AC") = 0 Then + Wscript.Echo "Apple" + Else + Wscript.Echo "Windows" + End If +Else + For i = 0 To counter-1 + If StrComp(deviceVID(i), "05AC") = -1 Then + nonApple = 1 + End If + Next + If nonApple = 1 Then + Wscript.Echo "Windows" + Else + Wscript.Echo "Apple" + End If +End If + +Set collDvcs = Nothing +Set oWMISrv = Nothing \ No newline at end of file