Last active
June 8, 2026 08:55
-
-
Save Ink230/5faaa6cb8f2a030ea89aa8aa149382f4 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #NoEnv | |
| SetTitleMatchMode, 2 | |
| ;direct window switch keys | |
| ;most common should be used here | |
| <^<!F4:: | |
| SwitchToWindowsTerminal() | |
| return | |
| <^<!F3:: | |
| OpenWindow("Helium","C:\Users\Justin\AppData\Local\imput\Helium\Application\chrome.exe" --profile-directory="Profile 1") | |
| return | |
| <^<!F1:: | |
| OpenWindow("Notepad","C:\Windows\notepad.exe") | |
| return | |
| <^<!F2:: | |
| OpenWindow("Visual Studio Code","C:\Program Files\Microsoft VS Code\Code.exe") | |
| return | |
| ;PgDn:: | |
| ;OpenWindow("Microsoft Visual Studio","C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\IDE\devenv.exe") | |
| ;return | |
| ;End:: | |
| return | |
| ^#!r:: | |
| Send, ^s ; To save a changed script | |
| Sleep, 300 ; give it time to save the script | |
| Reload | |
| Return | |
| ;often used 2 macros | |
| Home::SendRaw • | |
| End::SendRaw ✔ | |
| <#B:: | |
| WinMaximize, A | |
| return | |
| <#C:: | |
| WinClose, A | |
| return | |
| <#`:: | |
| SendInput, !``` | |
| return | |
| OpenWindow(TargetWindow, Path) | |
| { | |
| if (WinExist(TargetWindow)) | |
| { | |
| WinActivate, %TargetWindow% | |
| } | |
| else | |
| { | |
| Run, %Path% | |
| WinWait, %TargetWindow% | |
| WinActivate, %TargetWindow% | |
| } | |
| } | |
| SwitchToWindowsTerminal() | |
| { | |
| windowHandleId := WinExist("ahk_exe WindowsTerminal.exe") | |
| windowExistsAlready := windowHandleId > 0 | |
| ; If the Windows Terminal is already open, determine if we should put it in focus or minimize it. | |
| if (windowExistsAlready = true) | |
| { | |
| activeWindowHandleId := WinExist("A") | |
| windowIsAlreadyActive := activeWindowHandleId == windowHandleId | |
| if (windowIsAlreadyActive) | |
| { | |
| ; Minimize the window. | |
| WinMinimize, "ahk_id %windowHandleId%" | |
| } | |
| else | |
| { | |
| ; Put the window in focus. | |
| WinActivate, "ahk_id %windowHandleId%" | |
| WinShow, "ahk_id %windowHandleId%" | |
| } | |
| } | |
| ; Else it's not already open, so launch it. | |
| else | |
| { | |
| Run, wt | |
| } | |
| } | |
| #^Esc:: | |
| WinGet, TransLevel, Transparent, A | |
| If (TransLevel = OFF) { | |
| WinSet, Transparent, 210, A | |
| } Else { | |
| WinSet, Transparent, OFF, A | |
| } | |
| return | |
| #IfWinActive ahk_exe notepad.exe | |
| tab:: | |
| loop 2 | |
| send % A_Space | |
| return | |
| #If | |
| ; Globals | |
| DesktopCount = 6 ; Windows starts with 2 desktops at boot | |
| CurrentDesktop = 1 ; Desktop count is 1-indexed (Microsoft numbers them this way) | |
| ; | |
| ; This function examines the registry to build an accurate list of the current virtual desktops and which one we're currently on. | |
| ; Current desktop UUID appears to be in HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\SessionInfo\1\VirtualDesktops | |
| ; List of desktops appears to be in HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\VirtualDesktops | |
| ; | |
| mapDesktopsFromRegistry() { | |
| global CurrentDesktop, DesktopCount | |
| ; Get the current desktop UUID. Length should be 32 always, but there's no guarantee this couldn't change in a later Windows release so we check. | |
| IdLength := 32 | |
| SessionId := getSessionId() | |
| if (SessionId) { | |
| RegRead, CurrentDesktopId, HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\SessionInfo\%SessionId%\VirtualDesktops, CurrentVirtualDesktop | |
| if (CurrentDesktopId) { | |
| IdLength := StrLen(CurrentDesktopId) | |
| } | |
| } | |
| ; Get a list of the UUIDs for all virtual desktops on the system | |
| RegRead, DesktopList, HKEY_CURRENT_USER, SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\VirtualDesktops, VirtualDesktopIDs | |
| if (DesktopList) { | |
| DesktopListLength := StrLen(DesktopList) | |
| ; Figure out how many virtual desktops there are | |
| DesktopCount := DesktopListLength / IdLength | |
| } | |
| else { | |
| DesktopCount := 1 | |
| } | |
| ; Parse the REG_DATA string that stores the array of UUID's for virtual desktops in the registry. | |
| i := 0 | |
| while (CurrentDesktopId and i < DesktopCount) { | |
| StartPos := (i * IdLength) + 1 | |
| DesktopIter := SubStr(DesktopList, StartPos, IdLength) | |
| OutputDebug, The iterator is pointing at %DesktopIter% and count is %i%. | |
| ; Break out if we find a match in the list. If we didn't find anything, keep the | |
| ; old guess and pray we're still correct :-D. | |
| if (DesktopIter = CurrentDesktopId) { | |
| CurrentDesktop := i + 1 | |
| OutputDebug, Current desktop number is %CurrentDesktop% with an ID of %DesktopIter%. | |
| break | |
| } | |
| i++ | |
| } | |
| } | |
| ; | |
| ; This functions finds out ID of current session. | |
| ; | |
| getSessionId() | |
| { | |
| ProcessId := DllCall("GetCurrentProcessId", "UInt") | |
| if ErrorLevel { | |
| OutputDebug, Error getting current process id: %ErrorLevel% | |
| return | |
| } | |
| OutputDebug, Current Process Id: %ProcessId% | |
| DllCall("ProcessIdToSessionId", "UInt", ProcessId, "UInt*", SessionId) | |
| if ErrorLevel { | |
| OutputDebug, Error getting session id: %ErrorLevel% | |
| return | |
| } | |
| OutputDebug, Current Session Id: %SessionId% | |
| return SessionId | |
| } | |
| ; | |
| ; This function switches to the desktop number provided. | |
| ; | |
| switchDesktopByNumber(targetDesktop) | |
| { | |
| global CurrentDesktop, DesktopCount | |
| ; Re-generate the list of desktops and where we fit in that. We do this because | |
| ; the user may have switched desktops via some other means than the script. | |
| mapDesktopsFromRegistry() | |
| ; Don't attempt to switch to an invalid desktop | |
| if (targetDesktop > DesktopCount || targetDesktop < 1) { | |
| OutputDebug, [invalid] target: %targetDesktop% current: %CurrentDesktop% | |
| return | |
| } | |
| ; Go right until we reach the desktop we want | |
| while(CurrentDesktop < targetDesktop) { | |
| Send ^#{Right} | |
| CurrentDesktop++ | |
| OutputDebug, [right] target: %targetDesktop% current: %CurrentDesktop% | |
| } | |
| ; Go left until we reach the desktop we want | |
| while(CurrentDesktop > targetDesktop) { | |
| Send ^#{Left} | |
| CurrentDesktop-- | |
| OutputDebug, [left] target: %targetDesktop% current: %CurrentDesktop% | |
| } | |
| } | |
| ; | |
| ; This function creates a new virtual desktop and switches to it | |
| ; | |
| createVirtualDesktop() | |
| { | |
| global CurrentDesktop, DesktopCount | |
| Send, #^d | |
| DesktopCount++ | |
| CurrentDesktop = %DesktopCount% | |
| OutputDebug, [create] desktops: %DesktopCount% current: %CurrentDesktop% | |
| } | |
| ; | |
| ; This function deletes the current virtual desktop | |
| ; | |
| deleteVirtualDesktop() | |
| { | |
| global CurrentDesktop, DesktopCount | |
| Send, #^{F4} | |
| DesktopCount-- | |
| CurrentDesktop-- | |
| OutputDebug, [delete] desktops: %DesktopCount% current: %CurrentDesktop% | |
| } | |
| ; Main | |
| SetKeyDelay, 75 | |
| mapDesktopsFromRegistry() | |
| OutputDebug, [loading] desktops: %DesktopCount% current: %CurrentDesktop% | |
| ; User config! | |
| ; This section binds the key combo to the switch/create/delete actions | |
| LWin & 5::switchDesktopByNumber(1) | |
| LWin & 6::switchDesktopByNumber(2) | |
| LWin & 7::switchDesktopByNumber(3) | |
| LWin & 8::switchDesktopByNumber(4) | |
| LWin & 9::switchDesktopByNumber(5) | |
| LWin & 0::switchDesktopByNumber(6) | |
| LWin & 2::switchDesktopByNumber(7) | |
| LWin & 3::switchDesktopByNumber(8) | |
| LWin & 4::switchDesktopByNumber(9) | |
| ;CapsLock & 1::switchDesktopByNumber(1) | |
| ;CapsLock & 2::switchDesktopByNumber(2) | |
| ;CapsLock & 3::switchDesktopByNumber(3) | |
| ;CapsLock & 4::switchDesktopByNumber(4) | |
| ;CapsLock & 5::switchDesktopByNumber(5) | |
| ;CapsLock & 6::switchDesktopByNumber(6) | |
| ;CapsLock & 7::switchDesktopByNumber(7) | |
| ;CapsLock & 8::switchDesktopByNumber(8) | |
| ;CapsLock & 9::switchDesktopByNumber(9) | |
| ;CapsLock & n::switchDesktopByNumber(CurrentDesktop + 1) | |
| ;CapsLock & p::switchDesktopByNumber(CurrentDesktop - 1) | |
| ;CapsLock & s::switchDesktopByNumber(CurrentDesktop + 1) | |
| ;CapsLock & a::switchDesktopByNumber(CurrentDesktop - 1) | |
| ;CapsLock & c::createVirtualDesktop() | |
| ;CapsLock & d::deleteVirtualDesktop() | |
| ; Alternate keys for this config. Adding these because DragonFly (python) doesn't send CapsLock correctly. | |
| ;^!1::switchDesktopByNumber(1) | |
| ;^!2::switchDesktopByNumber(2) | |
| ;^!3::switchDesktopByNumber(3) | |
| ;^!4::switchDesktopByNumber(4) | |
| ;^!5::switchDesktopByNumber(5) | |
| ;^!6::switchDesktopByNumber(6) | |
| ;^!7::switchDesktopByNumber(7) | |
| ;^!8::switchDesktopByNumber(8) | |
| ;^!9::switchDesktopByNumber(9) | |
| ;^!n::switchDesktopByNumber(CurrentDesktop + 1) | |
| ;^!p::switchDesktopByNumber(CurrentDesktop - 1) | |
| ;^!s::switchDesktopByNumber(CurrentDesktop + 1) | |
| ;^!a::switchDesktopByNumber(CurrentDesktop - 1) | |
| ;^!c::createVirtualDesktop() | |
| ;^!d::deleteVirtualDesktop() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment