-
-
Save jcsteh/7ccbc6f7b1b7eb85c1c14ac5e0d65195 to your computer and use it in GitHub Desktop.
; SpotifyGlobalKeys.ahk: | |
; AutoHotkey script to control Spotify with global keyboard shortcuts | |
; Author: James Teh <jamie@jantrid.net> | |
; Copyright 2017-2018 James Teh | |
; License: GNU General Public License version 2.0 | |
DetectHiddenWindows, On | |
; Get the HWND of the Spotify main window. | |
getSpotifyHwnd() { | |
WinGet, spotifyHwnd, ID, ahk_exe spotify.exe | |
Return spotifyHwnd | |
} | |
; Send a key to Spotify. | |
spotifyKey(key) { | |
spotifyHwnd := getSpotifyHwnd() | |
; Chromium ignores keys when it isn't focused. | |
; Focus the document window without bringing the app to the foreground. | |
ControlFocus, Chrome_RenderWidgetHostHWND1, ahk_id %spotifyHwnd% | |
ControlSend, , %key%, ahk_id %spotifyHwnd% | |
Return | |
} | |
; Win+alt+p: Play/Pause | |
#!p:: | |
{ | |
spotifyKey("{Space}") | |
Return | |
} | |
; Win+alt+down: Next | |
#!Down:: | |
{ | |
spotifyKey("^{Right}") | |
Return | |
} | |
; Win+alt+up: Previous | |
#!Up:: | |
{ | |
spotifyKey("^{Left}") | |
Return | |
} | |
; Win+alt+right: Seek forward | |
#!Right:: | |
{ | |
spotifyKey("+{Right}") | |
Return | |
} | |
; Win+alt+left: Seek backward | |
#!Left:: | |
{ | |
spotifyKey("+{Left}") | |
Return | |
} | |
; shift+volumeUp: Volume up | |
+Volume_Up:: | |
{ | |
spotifyKey("^{Up}") | |
Return | |
} | |
; shift+volumeDown: Volume down | |
+Volume_Down:: | |
{ | |
spotifyKey("^{Down}") | |
Return | |
} | |
; Win+alt+o: Show Spotify | |
#!o:: | |
{ | |
spotifyHwnd := getSpotifyHwnd() | |
WinGet, style, Style, ahk_id %spotifyHwnd% | |
if (style & 0x10000000) { ; WS_VISIBLE | |
WinHide, ahk_id %spotifyHwnd% | |
} Else { | |
WinShow, ahk_id %spotifyHwnd% | |
WinActivate, ahk_id %spotifyHwnd% | |
} | |
Return | |
} |
https://gist.github.com/drandarov-io/96a5df7d1dee2d545f22fcaddf522284
Thought I'd add something that worked for me after much trial and error.
Yesterday I came to a similar approach) until it seems not stop working
spotifyKey(key) {
IfWinNotActive, ahk_exe Spotify.exe
{
DetectHiddenWindows, on
DetectHiddenText, on
ControlFocus, , , Chrome Legacy Window
ControlSend, ahk_parent , %key%, ahk_class Chrome_WidgetWin_1
return
}
IfWinActive, ahk_exe Spotify.exe
{
Send, %key%
return
}
Return
}
what is in line 23? you can insert this part at the beginning or end of the code
#If OnMy_Close_or_Min_Buttons() LButton:: Winhide #If OnMy_Close_or_Min_Buttons() { Static MyWindowCriteria := "ahk_exe Spotify.exe" ; change to meet your neeeds Critical SetTitleMatchMode, 2 CoordMode, Mouse, Screen MouseGetPos, X, Y, MID ;ToolTip, mid %mid% If (WID := WinExist(MyWindowCriteria)) && (WID = MID) { SendMessage, 0x0084, 0, (X & 0xFFFF) | ((Y & 0xFFFF) << 16) ; WM_NCHITTEST ;Return (ErrorLevel = 20) ; HTCLOSE ;Return (ErrorLevel = 8) ; HTmin ;ToolTip, ErrorLevel %ErrorLevel% if ((ErrorLevel = "20") or (ErrorLevel = "8")) { ;ToolTip, test return true } } Return False }
this
; Send a key to Spotify. spotifyKey(key) { ;spotifyHwnd := getSpotifyHwnd() ; Chromium ignores keys when it isn't focused. ; Focus the document window without bringing the app to the foreground. IfWinNotActive, ahk_exe Spotify.exe { DetectHiddenWindows, on DetectHiddenText, on WinGet, OutputVar1, ID , ahk_exe Spotify.exe ControlFocus, , ahk_id %OutputVar1% ControlSend, ahk_parent , %key%, ahk_class Chrome_WidgetWin_1 return } IfWinActive, ahk_exe Spotify.exe { Send, %key% ;ToolTip, keyssend return } Return }`
instead of
`; Send a key to Spotify. spotifyKey(key) { spotifyHwnd := getSpotifyHwnd() ControlClick, x500 y100, ahk_id %spotifyHwnd%, , Left, 1, U ControlSend, ahk_parent, %key%, ahk_id %spotifyHwnd% }
but additional testing revealed that sometimes this method stops working, I am looking for and trying new approaches that can give permanent work in a collapsed state.
This code works fine for me with Spotify minimized in tray (!), much to my delight (finally! After months of agony!)
DetectHiddenWindows, On
; Get the HWND of the Spotify main window.
getSpotifyHwnd() {
WinGet, spotifyHwnd, ID, ahk_exe spotify.exe
Return spotifyHwnd
}
; Send a key to Spotify.
spotifyKey(key) {
spotifyHwnd := getSpotifyHwnd()
; Chromium ignores keys when it isn't focused.
; Focus the document window without bringing the app to the foreground.
ControlFocus, Chrome_RenderWidgetHostHWND1, ahk_id %spotifyHwnd%
ControlSend, , %key%, ahk_id %spotifyHwnd%
Return
}
; Ctrl+Shift+q: Play/Pause
^+q::
{
spotifyKey("{Space}")
Return
}
; alt+v: Next
!v::
{
spotifyKey("^{Right}")
Return
}
; alt+z: Previous
!z::
{
spotifyKey("^{Left}")
Return
}
; Ctrl+alt+Up: Volume up
^!Up::
{
spotifyKey("^{Up}")
Return
}
; Ctrl+alt+Down: Volume Down
^!Down::
{
spotifyKey("^{Down}")
Return
}
; Ctrl+: Show Spotify ^
::
{
spotifyHwnd := getSpotifyHwnd()
WinGet, style, Style, ahk_id %spotifyHwnd%
if (style & 0x10000000) { ; WS_VISIBLE
WinHide, ahk_id %spotifyHwnd%
} Else {
WinShow, ahk_id %spotifyHwnd%
WinActivate, ahk_id %spotifyHwnd%
}
Return
}
Sometimes it doesn't catch the focus or on the contrary, holds it, but it already trifles for a couple clicks :)
what is in line 23?
you can insert this part at the beginning or end of the code
#If OnMy_Close_or_Min_Buttons()
LButton:: Winhide
#If
OnMy_Close_or_Min_Buttons() {
Static MyWindowCriteria := "ahk_exe Spotify.exe" ; change to meet your neeeds
Critical
SetTitleMatchMode, 2
CoordMode, Mouse, Screen
MouseGetPos, X, Y, MID
;ToolTip, mid %mid%
If (WID := WinExist(MyWindowCriteria)) && (WID = MID) {
SendMessage, 0x0084, 0, (X & 0xFFFF) | ((Y & 0xFFFF) << 16) ; WM_NCHITTEST
;Return (ErrorLevel = 20) ; HTCLOSE
;Return (ErrorLevel = 8) ; HTmin
;ToolTip, ErrorLevel %ErrorLevel%
if ((ErrorLevel = "20") or (ErrorLevel = "8"))
{
;ToolTip, test
return true
}
}
Return False
}
this
; Send a key to Spotify.
spotifyKey(key) {
;spotifyHwnd := getSpotifyHwnd()
; Chromium ignores keys when it isn't focused.
; Focus the document window without bringing the app to the foreground.
IfWinNotActive, ahk_exe Spotify.exe
{
DetectHiddenWindows, on
DetectHiddenText, on
WinGet, OutputVar1, ID , ahk_exe Spotify.exe
ControlFocus, , ahk_id %OutputVar1%
ControlSend, ahk_parent , %key%, ahk_class Chrome_WidgetWin_1
return
}
IfWinActive, ahk_exe Spotify.exe
{
Send, %key%
;ToolTip, keyssend
return
}
Return
}`
instead of
`; Send a key to Spotify.
spotifyKey(key) {
spotifyHwnd := getSpotifyHwnd()
ControlClick, x500 y100, ahk_id %spotifyHwnd%, , Left, 1, U
ControlSend, ahk_parent, %key%, ahk_id %spotifyHwnd%
}
but additional testing revealed that sometimes this method stops working, I am looking for and trying new approaches that can give permanent work in a collapsed state.