Non ho il rappresentante per inserire questo in un commento alla risposta di GollyJer, ma ho notato quando provavo a usare quello script che c'era un problema con i tasti {down} che in qualche modo gli avrebbe fatto spostare il brano evidenziato nella playlist verso il basso , invece di spostarsi verso il basso nel menu. L'ho modificato per fare un clic del mouse sulla voce di menu "Stella" invece di usare i tasti, sembra funzionare abbastanza bene. L'ho anche modificato per minimizzare Spotify prima che ritorni alla finestra che stavi usando se fosse minimizzato per cominciare.
^+*::
spotify = ahk_class SpotifyMainWindow
IfWinExist, %spotify%
{
WinGet, MMX, MinMax, %spotify%
;Store active window and mouse position.
WinGetActiveTitle, activeWindow
MouseGetPos x, y, winID
;Activate Spotify.
WinActivate %spotify%
WinWaitActive %spotify%
;Right click near the song title in the "Now Playing" box.
WinGetPos, , , , spotifyHeight, %spotify%
MouseClick, Right, 100, spotifyHeight - 70, 1, 0
;Get the contents of the context menu.
WinWait, ahk_class #32768
SendMessage, 0x1E1 ; MN_GETHMENU
allContextMenuInfo := ErrorLevel
;The "Star" command is the 5th menu item.
;If the song is Unstarred the text is Star, and vice versa. But sometimes some wierd characters are included.
;The only reliable way I found is to check if the first letter is S.
menuText_StarUnstar := GetContextMenuItemText(allContextMenuInfo, 5)
StringGetPos, positionOfS, menuText_StarUnstar, S
;If S is the first letter, star the song.
notStarred := (%positionOfS% = 0)
If notStarred {
;Arrow down to the Star menu item and press enter.
MouseClick, Left, 20, -120, 1, 0,, R
} Else {
;Just close the context menu.
Send {Escape}
}
;Restore original window and mouse position.
IfEqual MMX, -1, WinMinimize, %spotify%
WinActivate ahk_id %winID%
MouseMove %x%, %y%
}
Return
;Context menu helper function.
GetContextMenuItemText(hMenu, nPos)
{
length := DllCall("GetMenuString"
, "UInt", hMenu
, "UInt", nPos
, "UInt", 0 ; NULL
, "Int", 0 ; Get length
, "UInt", 0x0400) ; MF_BYPOSITION
VarSetCapacity(lpString, length + 1)
length := DllCall("GetMenuString"
, "UInt", hMenu
, "UInt", nPos
, "Str", lpString
, "Int", length + 1
, "UInt", 0x0400)
return lpString
}