AHK key remapping alt tab - autohotkey

My goal is to make my mouse extra button act as alt tab so I could scroll through my tabs without using the keyboard.
XButton1::Alt
LButton::
If (GetKeyState("XButton1", "P"))
Send {TAB down}
LButton Up::
If (GetKeyState("XButton1", "P"))
Send {TAB up}
What I was hoping for this to do was when I am holding XButton1(the back button on my mouse) I could click and it would act as a tab and only while I am holding XButton1 otherwise it my click would act as a click

Try this:
XButton1::Send {XButton1} ; If you remove this line XButton1 loses its original/native function
; Hold down XButton1 and press LButton to navigate the alt-tab menu:
XButton1 & LButton::AltTab ; XButton1 becomes a prefix key
https://autohotkey.com/docs/Hotkeys.htm#combo
https://autohotkey.com/docs/Hotkeys.htm#AltTabDetail

; AltTab-replacement for Windows 8:
XButton1 & LButton::
list = ""
WinGet, id, list
Loop, %id%
{
this_ID := id%A_Index%
WinGet, exStyle, exStyle, ahk_id %this_ID%
If !(exStyle & 0x100)
continue
IfWinActive, ahk_id %this_ID%
continue
WinGetTitle, title, ahk_id %this_ID%
If (title = "")
continue
WinActivate, ahk_id %this_ID%
break
}
return
; AltTabMenu-replacement for Windows 8:
XButton1 & RButton::
list = ""
Menu, windows, Add
Menu, windows, deleteAll
WinGet, id, list
Loop, %id%
{
this_ID := id%A_Index%
WinGet, exStyle, exStyle, ahk_id %this_ID%
If !(exStyle & 0x100)
continue
WinGetTitle, title, ahk_id %this_ID%
If (title = "")
continue
WinGetClass, class, ahk_id %this_ID%
If (class = "")
continue
If (class = "ApplicationFrameWindow")
continue
Menu, windows, Add, %title%%A_Tab%ahk_class %class%, ActivateWindow
WinGet, Path, ProcessPath, ahk_id %this_ID%
Menu, windows, Icon, %title%%A_Tab%ahk_class %class%, %Path%,, 0
}
Menu, windows, Show
return
ActivateWindow:
WinActivate, %A_ThisMenuItem%
return
XButton1::Send {XButton1}

Related

open program from windows Tray

I made a script that simply opens or activate specific app.
it works great but I have one issue, when the app minimized to windows tray.
the Hotkey activate the Else statement part so it creates another instance of the same app.
!a::
If WinExist("ahk_exe Orzeszek Timer.exe")
{
WinActivate, ahk_exe Orzeszek Timer.exe
}
Else {
Run, "D:\Portable\PortableApps\Orzeszek Timer\Orzeszek Timer.exe"
}
Return
I need help with script to trigger the IF statement part in case the app appears in system tray.
Much Thanks in advance)
Try this
!a::
Process, Exist, Orzeszek Timer.exe
If (Errorlevel != 0) ; is running
{
WinGet, WinState, MinMax, ahk_exe Orzeszek Timer.exe
If (WinState = "") ; is minimized to tray
SendInput, #bo{Enter} ; Win+b activates the tray, o marks the icon of Orzeszek Timer
else
WinActivate, ahk_exe Orzeszek Timer.exe
}
else ; is NOT running
Run, "D:\Portable\PortableApps\Orzeszek Timer\Orzeszek Timer.exe"
return
If the program has its own hotkey to restore the window, use that hotkey instead of #bo{Enter}.
EDIT:
If SendInput, #bo{Enter} is too fast to restore the program, add a sleep between the keys to send:
...
If (WinState = "") ; is minimized to tray
{
SendInput, #b ; Win+b activates the tray
; WinWaitActive, ahk_class Shell_TrayWnd
Sleep, 300
SendInput, o ; o marks the icon of Orzeszek Timer. Try first of all manually which letter marks the icon
Sleep, 300
SendInput, {Enter}
}
...
EDIT 2:
I downloaded that small portable app and this is working on my system:
!a::
Process, Exist, Orzeszek Timer.exe
If (Errorlevel != 0) ; is running
{
WinGet, WinState, MinMax, ahk_exe Orzeszek Timer.exe
If (WinState = "") ; is minimized to tray
; SendInput, #bot{Enter} ; OR:
SendInput, #b{Enter}{Up}ot{Enter}
}
else ; is NOT running
Run, "D:\Portable\PortableApps\Orzeszek Timer\Orzeszek Timer.exe"
WinWait, Orzeszek Timer,, 10
If (!ErrorLevel)
{
WinActivate, Orzeszek Timer
WinWaitActive Orzeszek Timer,, 5
If (!ErrorLevel)
MouseMove, 150, 80, 0
}
return
EDIT 3:
If you don't have the option "Always show all icons in the notification area" in the Settings enabled, try replacing
SendInput, #bot{Enter}
with
SendInput, #b{Enter}{Up}ot{Enter}
user3419297 much thanks for your script it works great. I Modified it a little to be open the app.
!a::
Process, Exist, Orzeszek Timer.exe
If (Errorlevel != 0) ; is running
{
WinGet, WinState, MinMax, ahk_exe Orzeszek Timer.exe
If (WinState = "") {
SendInput, #bo{Right}{Enter}
Sleep, 500
CoordMode, Mouse, Window
MouseMove, 150, 80, 0
}
else
WinActivate, ahk_exe Orzeszek Timer.exe
}
else ; is NOT running
Run, "D:\Portable\PortableApps\Orzeszek Timer\Orzeszek Timer.exe"
return
only one minor disadvantage the script depend on app been place first
in windows tray list.
of course I could always redefine {Right x} placement but is there more efficient way to find automatically app placement in tray?
finally works! the only missing part in script was {Up} key as pointed on edit 3 for system tray to become searchable. so now I had no problem to find the exact key. in my case it was
SendInput, #b{Enter}{Up}tt
Sleep, 100
SendInput, {Enter}
I Really don't know how to thank you. you helped me alot )

AHK Opening last opened windows explorer window if active, else starting new

This code figures out the current explorer windows open,
I would like to open the first in the list, and if the list is empty open a
new explorer instead.
I hope to the open/activate the either window at the current mouse position
#e::
list := ""
numberOfwindows := ""
wins := ""
WinGet, id, list, ahk_class CabinetWClass ahk_exe explorer.exe
Loop, %id%
{
numberOfwindows := A_Index
this_ID := id%A_Index%
WinGetTitle, title, ahk_id %this_ID%
wins .= A_Index A_Space title ? A_Index A_Space title "`n" : ""
}
MsgBox, number of explorer windows = %numberOfwindows%`n`n%wins%
return
This solves it. - however it can be optimized, anyone have any suggestions ?
#e::
list := ""
numberOfwindows := ""
wins := ""
WinGet, id, list, ahk_class CabinetWClass ahk_exe explorer.exe
Loop, %id%
{
numberOfwindows := A_Index
this_ID := id%A_Index%
WinGetTitle, title, ahk_id %this_ID%
if (A_Index = 1) { ; if it's the first index of the loop
;MsgBox %title%
win = %title% ; store the title in " win "
}
wins .= A_Index A_Space title ?½½ A_Index A_Space title "`n" : ""
}
IfWinNotExist ahk_class CabinetWClass
{
Run C:\Windows\explorer.exe
win := File Explorer
WinWait, %win% ahk_class CabinetWClass
WinMove, mxpos_new , mypos_new
WinActivate
}
;MsgBox, number of explorer windows = %numberOfwindows%`n`n%wins%
; above msgbox displays number and the names of the windows.
;~ ; we now know the win
; and its title, exe and class.
; we want it's current position.
WinGetPos, X, Y, Width, Height,%win% ahk_class CabinetWClass
;MsgBox, %X%, %Y%, %Width%, %Height%
; and we want the mouse position.
CoordMode, Mouse, Screen ; Coordinates are relative to the desktop (entire screen).
MouseGetPos, mxpos , mypos,
;MsgBox, %mxpos%, %mypos%
mxpos_new := mxpos - (Width / 2)
mypos_new := mypos - (Height / 2)
;MsgBox, %mxpos% %mypos% %Width% %Height% %mxpos_new% %mypos_new%
; activate that specific window
WinWait, %win% ahk_class CabinetWClass
WinMove, mxpos_new , mypos_new
WinActivate
return

Autohotkey: Activate foremost of X monitor

How do I activate the foremost window in a given monitor? suppose I have two monitors, one with an editor, and one with different apps, such as chrome and slack. I want to bind a key that will activate the foremost window in monitor two, be it slack or chrome, and one for the editor, for easy manuvering.
The foremost window in a given monitor is the currently active window
or (if the currently active window is on the other monitor) the last active window of this monitor.
; activate the editor:
F1::
WinActivate, ahk_exe notepad.exe ; replace notepad with the ahk_exe of the editor
return
; activate the last active window in the right monitor:
F2::
WinGetPos, X,,,, A
If (X > 1920) ; replace 1920 with the width of the left monitor
return ; do nothing
; otherwise:
WinGet, id, list
Loop, %id%
{
this_ID := id%A_Index%
WinGet, exStyle, exStyle, ahk_id %this_ID%
If !(exStyle & 0x100)
continue
WinGetTitle, title, ahk_id %this_ID%
If (title = "")
continue
WinGetPos, X,,,, ahk_id %this_ID%
If (X > 1920) ; replace 1920 with the width of the left monitor
{
WinActivate, ahk_id %this_ID%
break
}
}
return

What is the right way to send Alt + Tab in Ahk?

Ok. I know this is a very stupid question.
But I'm stuck already for an hour.
I got very little experience with ahk, however I made work every script until now with no problems. I explored the ahk tutorials but found no solution up to now.
I'm trying to switch to prev. app with a single numpad off key.
I've tried:
!{Tab}
,
{Alt down}{Tab}{Alt up}
I've tried it with Sleep delays, multiline, multiline inside brackets, with and without commas after commands, etc.
I'm quite sure is very simple but something I've not tried yet.
Any suggestion?
$F1:: AltTab()
$F2:: AltTabMenu()
; AltTab-replacement for Windows 8:
AltTab(){
list := ""
WinGet, id, list
Loop, %id%
{
this_ID := id%A_Index%
IfWinActive, ahk_id %this_ID%
continue
WinGetTitle, title, ahk_id %this_ID%
If (title = "")
continue
If (!IsWindow(WinExist("ahk_id" . this_ID)))
continue
WinActivate, ahk_id %this_ID%
WinWaitActive, ahk_id %this_ID%,,2
break
}
}
; AltTabMenu-replacement for Windows 8:
AltTabMenu(){
list := ""
Menu, windows, Add
Menu, windows, deleteAll
WinGet, id, list
Loop, %id%
{
this_ID := id%A_Index%
WinGetTitle, title, ahk_id %this_ID%
If (title = "")
continue
If (!IsWindow(WinExist("ahk_id" . this_ID)))
continue
Menu, windows, Add, %title%, ActivateTitle
WinGet, Path, ProcessPath, ahk_id %this_ID%
Try
Menu, windows, Icon, %title%, %Path%,, 0
Catch
Menu, windows, Icon, %title%, %A_WinDir%\System32\SHELL32.dll, 3, 0
}
CoordMode, Mouse, Screen
MouseMove, (0.4*A_ScreenWidth), (0.35*A_ScreenHeight)
CoordMode, Menu, Screen
Xm := (0.25*A_ScreenWidth)
Ym := (0.25*A_ScreenHeight)
Menu, windows, Show, %Xm%, %Ym%
}
ActivateTitle:
SetTitleMatchMode 3
WinActivate, %A_ThisMenuItem%
return
;-----------------------------------------------------------------
; Check whether the target window is activation target
;-----------------------------------------------------------------
IsWindow(hWnd){
WinGet, dwStyle, Style, ahk_id %hWnd%
if ((dwStyle&0x08000000) || !(dwStyle&0x10000000)) {
return false
}
WinGet, dwExStyle, ExStyle, ahk_id %hWnd%
if (dwExStyle & 0x00000080) {
return false
}
WinGetClass, szClass, ahk_id %hWnd%
if (szClass = "TApplication") {
return false
}
return true
}
EDIT (suggested by the user Ooker):
The script pops up a menu for you to choose.
This is what it looks like:
If you just want to switch back to the previous application, use Send, !{Esc}
You shouldn't manually send alt+tab as it is a special windows command, rather use the AltTab commands that do that for you.
AltTabMenu opens the tab menu and selects the program, whileAltTab, ShiftAltTab navigate through it.
h::AltTabMenu
n::AltTab
m::ShiftAltTab
There are some issues with Windows 8/10 and keys like ctrl-alt-del and alt-tab. Here is one solution:
F1::
{
Send {Alt Down}{Tab} ;Bring up switcher immediately
KeyWait, F1, T.5 ; Go to next window; wait .5s before looping
if (Errorlevel)
{
While ( GetKeyState( "F1","P" ) ) {
Send {Tab}
Sleep, 400 ; wait 400ms before going to next window
}
}
Send {Alt Up} ;Close switcher on hotkey release
}
return
My personal goal was to remap Alt-Tab to Win-Tab (because I'm using a Mac keyboard on a Windows 10) so I took what Stepan wrote above plus some documentation and here is is, working fine for me :
#Tab::
{
Send {LAlt Down}{Tab}
KeyWait, LWin ; Wait to release left Win key
Send {LAlt Up} ; Close switcher on hotkey release
}
return
Worked for me:
F1::
Send, {ALT DOWN}{TAB}{ALT UP}
return
It simulates the Alt + Tab behavior for F1 key.
Well, finally I found the reason and some "solutions" here and here.
It seems that Windows 8 blocks Ahk {Alt Down}{Tab} and AltTabMenu and some other keys.
For now I'm using this to scroll windows forward:
Send !{ESC}
This to display the AltTabMenu:
Run, "C:\Users\Default\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch\Window Switcher.lnk"
And this to switch to the previous app as suggested in one of the topics:
LCtrl & z:: ; AltTabMenu
state := GetKeyState("Capslock", "T")
if state = 1
SetCapsLockState, Off ; CapsLock On blocks Task Switching metro window
Send, !{Tab} ; prevents displaying inactive Task Switching metro window
run, Window Switcher.lnk ; must be in script directory otherwise include path
WinWait, Task Switching,, 2
KeyWait, Ctrl
Send, {Enter}
if state = 1
SetCapsLockState, On ; restores CapsLock State
state =
return
#IfWinActive, Task Switching
LCtrl & q::Send, {Right}
LCtrl & a::Send, {Left}
It would be great to get to the previous app with no AltTabMenu splashing.
In case you want to do multiple "tabs", then the below function should help doing that. This was at least own solution on my Windows 8.1 machine.
The approach is:
1) Get a list of all the windows
2) Loop 1:
find the index of the current window
set the index to switch to ("current" + "offset")
3) Loop 2:
loop until you hit the index to switch to, then switch window
AutoHotKey code sample below:
; Test switch of 1 window
F1::AltTabFunction(offset:=1)
; Test switch of 2 windows
F2::AltTabFunction(offset:=2)
AltTabFunction(offset:=1)
{
; ****************************
; Function for switching windows by ALT-TAB (offset = number of windows to "tab")
; ****************************
; Get list of all windows.
WinGet, AllWinsHwnd, List
WinGetTitle, active_title, A ; Get title of active window.
; Find index of the current window.
counter_of_none_hidden_windows := 0 ; Initiate counter for counting only the none-hidden windows.
Loop, % AllWinsHwnd
{
; Find title for window in this loop.
WinGetTitle, CurrentWinTitle, % "ahk_id " AllWinsHwnd%A_Index%
; From [1]: "Retrieves an 8-digit hexadecimal number representing the extended style of a window.".
; [1] : https://autohotkey.com/docs/commands/WinGet.htm
WinGet, exStyle, exStyle, % "ahk_id" AllWinsHwnd%A_Index%
; Skip hidden windows by checking exStyle.
If !(exStyle & 0x100){
Continue
}
; Window is not hidden. Increase counter.
counter_of_none_hidden_windows := counter_of_none_hidden_windows+1
; Set flag.
titles_match := CurrentWinTitle = active_title
If (titles_match) {
window_index_to_switch_to := counter_of_none_hidden_windows+offset
break
}
}
; Find index of the window to switch to and do the actual switch
counter_of_none_hidden_windows := 0 ; Initiate counter for counting only the none-hidden windows.
Loop, % AllWinsHwnd
{
; From [1]: "Retrieves an 8-digit hexadecimal number representing the extended style of a window.".
; [1] : https://autohotkey.com/docs/commands/WinGet.htm
WinGet, exStyle, exStyle, % "ahk_id" AllWinsHwnd%A_Index%
; Skip hidden windows by checking exStyle.
If !(exStyle & 0x100){
Continue
}
; Window is not hidden. Increase counter.
counter_of_none_hidden_windows := counter_of_none_hidden_windows+1
; Set flag.
found_window_to_switch_to := counter_of_none_hidden_windows = window_index_to_switch_to
; Switch window.
If (found_window_to_switch_to) {
; Get title.
WinGetTitle, CurrentWinTitle, % "ahk_id " AllWinsHwnd%A_Index%
; Activate by title.
WinActivate, %CurrentWinTitle%
; Stop loop.
break
}
}
return ; Nothing to return
}
send {Alt down}{tab}
send {Alt up}
!{Tab} works to switch between windows if you add sleep before and after it.
Sleep 100
Send !{Tab}
Sleep 100
Please refer to this link: https://www.autohotkey.com/docs/Hotkeys.htm#alttab
To cancel the Alt-Tab menu without activating the selected window, press or send Esc. In the following example, you would hold the left Ctrl and press CapsLock to display the menu and advance forward in it. Then you would release the left Ctrl to activate the selected window, or press the mouse wheel to cancel. Define the AltTabWindow window group as shown below before running this example.
LCtrl & CapsLock::AltTab
#IfWinExist ahk_group AltTabWindow ; Indicates that the alt-tab menu is present on the screen.
MButton::Send {Blind}{Escape} ; The * prefix allows it to fire whether or not Alt is held down.
#If
I've modified the example from the help page on this found here: https://www.autohotkey.com/docs/Hotkeys.htm#AltTabDetail
This was mainly to remap the Windows+Tab key to the Alt+Tab key in this example.
It opens the task view and waits for the user to click, escape or enter. The example from the help page has the alt key getting stuck for me so I changed it to work a little better.
Please let me know if this works for you all.
; Override the Left Win key and tab to Alt + Tab
; Help found here:
; https://www.autohotkey.com/docs/Hotkeys.htm#AltTabDetail
; #IfWinExist ahk_group AltTabWindow
#NoEnv
#SingleInstance force
SendMode Input
LWin & Tab::Send {Alt down}{tab} ; Asterisk is required in this case.
!LButton::
{
Click
Send {Alt up} ; Release the Alt key, which activates the selected window.
}
!Enter::
{
Send {Alt up} ; Release the Alt key, which activates the selected window.
}
~*Esc::
{
Send {Alt up} ; When the menu is cancelled, release the Alt key automatically.
;*Esc::Send {Esc}{Alt up} ; Without tilde (~), Escape would need to be sent.
}
I got ALT TAB to work with F1
By pressing F1 you can switch to the last window
While F1 is kept pressed you can move around with arrow keys or tab to select the window you need.
Code:
`F1::
Send, {ALT DOWN}{TAB}{TAB UP} ; If F1 is down it invokes the menu for switching windows.
KeyWait, F1 ; Show menu for switching windows by keeping ALT down until user physically releases F1.
Send, {ALT UP} ; If F1 is released release ALT key
return`
Documentation links
KeyWait
KeyList
I think this question was meant to be a simple request of: how to alt tab in Win10 using AHK, since win10 changed things up? -> I found the most simple solution as shown below... the code makes it necessary to keep the alt key down while the Win10 emu is open - then use the arrow keys an additional number of tabs (if you need three alt tabs, then it's "alt tab, then right 2", see?
macro key name::
{
Sleep 100
Send, ^c
Sleep 1000
Send, {alt down}{tab}
Sleep 400
Send, {right 2}{alt up}
Sleep 400
Send, ^v
Sleep 400
}
So just play with this snip in your code and you can jump passed the 'next' window(s) open.
Rossman

Typing on two windows at the same time

I want to be able to select both window 1 and window 2 and be able to type on both windows at the same time.
Whatever I type in window 1 will be typed in window 2 as well, for example: "hey everyone".
Being able to type on both windows at the same time, having both selected for typing. I have 2 notepad windows open. I want to type on the the first notepad window I opened, and what ever I type on window 1 will also be typed on window 2.
Sadly, I can't put up a image for you can see what I'm trying to say
WinGet, windowid, List, <Name of Window goes here>
#IfWinActive, <Name of Window goes here>
Space:: ; jump
KeyWait, Space, D
ControlSend,, {Space} , ahk_id %windowid1%
ControlSend,, {Space} , ahk_id %windowid2%
ControlSend,, {Space} , ahk_id %windowid3%
ControlSend,, {Space} , ahk_id %windowid4%
ControlSend,, {Space} , ahk_id %windowid5%
Return
I'm not sure if I even understand what you're trying to do... but have you tried using Input?
loop {
input, char, I L1 V M
ControlSend,, %char%, ahk_id %windowid1%
}
For example: Catching every single character sent in any %processID% window by Input and sending it to all remaining %processID% windows afterwards:
processID := "notepad.exe"
loop {
input, char, I L1 V M
winGet, active_win_ID, ID, A
winGet, active_win_exe, ProcessName, A
winGet, windowsToBeSentTo_IDs, List, ahk_exe %processID%
if active_win_exe != %processID%
continue
loop, %windowsToBeSentTo_IDs% {
_id := windowsToBeSentTo_IDs%a_index%
if _id != %active_win_ID%
controlSend,, %char%, ahk_id %_id%
}
}