Как пометить песню Spotify, когда она свернута?
Итак, приложение Spotify в Windows не имеет встроенной поддержки глобальных горячих клавиш и очень простых горячих клавиш, даже когда окно приложения в настоящее время активно. К сожалению, «звездная» песня, которая сейчас играет, не имеет сочетания клавиш, даже когда окно активно.
Итак, у меня есть скрипт Autohotkey, который дает мне глобальные горячие клавиши для управления воспроизведением, громкостью и копированием названия песни (включая исправление длинного тире), но я наткнулся на кирпичную стену, пытаясь выяснить, как пометить текущую песню.
Чтобы еще больше усложнить ситуацию, я хочу, чтобы скрипт Autohotkey только отмечал песню, если она еще не помечена. Если он уже отмечен звездочкой, просто оставьте его в покое.
Я хочу, чтобы все это происходило, когда Приложение находится в трее, не открывая окно.
РЕДАКТИРОВАТЬ: полу-рабочее решение
Итак, я придумал разумное решение, оно открывает контекстное меню, даже когда программа свернута, и делает все, в том числе не снимает пометки с песен. К сожалению, контекстное меню означает, что оно на долю секунды минимизирует полноэкранные приложения, такие как игры. В зависимости от игры это может быть неприятно, но это лучшее, что я могу сделать без причудливых вызовов DLL и прочего.
#NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases.
SendMode Input ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir% ; Ensures a consistent starting directory.
;|---------------|
;|--[ SOURCES ]--|
;|---------------|
;Base Spotify Script from: http://www.autohotkey.com/board/topic/36239-spotify-global-hotkeys/
;Base Starring Script from: http://superuser.com/questions/324416/any-spotify-tweaks-with-keyboard-shortcut-to-star-tracks
;|------------------|
;|--[ SETTING UP ]--|
;|------------------|
DetectHiddenWindows, On ;Detect Spotify even if it's minimized
#IfWinExist ahk_class SpotifyMainWindow ;Only do the following if Spotify is running
spotify = ahk_class SpotifyMainWindow ;Set variable for Spotify Window Name
;|---------------|
;|--[ HOTKEYS ]--|
;|---------------|
; "CTRL + ALT + PAGEUP" for previous
^!PGUP::
{
ControlSend, ahk_parent, ^{Left}, %spotify%
return
}
; "CTRL + ALT + PAGEDOWN" for next
^!PGDN::
{
ControlSend, ahk_parent, ^{Right}, %spotify%
return
}
; "CTRL + ALT + HOME" for pause
^!Home::
{
ControlSend, ahk_parent, {Space}, %spotify%
return
}
; "CTRL + ALT + END" for track-name
^!End::
{
WinGetTitle, spotify_playing, %spotify% ;Get the title of Spotify which contains the track-name
StringTrimLeft, trimmed_playing, spotify_playing, 10 ;Get rid of extra text and place into 'trimmed_playing'
StringReplace, replaced_playing, trimmed_playing, –, -, All ;Replace en dash with normal dash and place into 'replaced_playing'
clipboard = %replaced_playing% ;Copy the fixed text to clipboard
return
}
; "CTRL + ALT + UP" for volume up
^!Up::
{
ControlSend, ahk_parent, ^{Up}, %spotify%
return
}
; "CTRL + ALT + DOWN" for volume down
^!Down::
{
ControlSend, ahk_parent, ^{Down}, %spotify%
return
}
; "CTRL + ALT + INSERT" for starring the current song
^!Insert::
{
;Store active window and mouse position.
MouseGetPos, , , winID
;Right click near the song title in the "Now Playing" box.
WinGetPos, , , , spotifyHeight, %spotify%
clickX := 100
clickY := spotifyHeight-70
ControlClick, x%clickX% y%clickY% , %spotify%, , Right, , NA
;Get the contents of the context menu.
WinWait, ahk_class #32768
SendMessage, 0x1E1 ;MN_GETHMENU
allContextMenuInfo := ErrorLevel
;The "Star" command is the 2nd 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, 2)
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.
ControlSend, ahk_parent, {Down}{Down}{Enter}, %spotify%
}
Else
{
;Just close the context menu.
ControlSend, ahk_parent, {Escape}, %spotify%
}
;Restore original window and mouse position.
WinActivate ahk_id %winID%
return
}
;|-----------------|
;|--[ FUNCTIONS ]--|
;|-----------------|
;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
}
Я изменил некоторые существующие скрипты, которые были спрятаны в Интернете. Источники которых можно найти в верхней части исходного кода, это может помочь, если кто-то захочет попробовать и заставить его работать полностью без появления контекстного меню.
Как можно пометить песню при обычном использовании приложения?
Кажется, есть только 2 способа добавить песню в Spotify.
- Щелкните правой кнопкой мыши обложку альбома в левом нижнем углу и воспользуйтесь опцией контекстного меню со звездочкой.
- Щелкните правой кнопкой мыши песню в списке воспроизведения и используйте опцию контекстного меню со звездочкой.
Чтобы сделать вещи неудобными, пункт меню со звездочкой заменен параметром меню со звездочкой в том же месте, если что-то уже помечено. У них также есть такая же горячая клавиша, когда меню открыто (клавиша t). Таким образом, вы не можете просто выбрать слепое меню без какой-либо предварительной проверки.
Итак, какие возможные маршруты мы могли бы выбрать?
Щелчок правой кнопкой мыши по обложке альбома в левом нижнем углу - единственный реалистичный путь.
Если мы можем прочитать текст из контекстного меню в свернутом виде, мы можем определить, помечено ли что-то уже, по изменению текста со «звездочки» на «снятие звездочки». После этого теста мы можем решить, нажимать ли клавишу T, чтобы на самом деле начать песню.
Я также провел некоторое время с Window Detective, чтобы посмотреть, могу ли я просто отправить относительно простое сообщение PostMessage / SendMessage, чтобы пометить песню. Но у меня очень мало опыта, и я не знаю, как связать их вместе, чтобы получить желаемый результат.
Я обнаружил, что пункты контекстного меню пометки и снятия пометки на самом деле разные:
Star -> WM_MENUSELECT (0x11F) | item identifier = 11 | flags = NONE | MF_HILITE
Unstar -> WM_MENUSELECT (0x11F) | item identifier = 12 | flags = NONE | MF_HILITE
Однако я не знаю, как на самом деле объединить PostMessages / SendMessages, чтобы открыть меню, а затем выбрать только элемент №11 и затем нажать Enter.
Список сообщений, которые Spotify получает при добавлении чего-либо
На всякий случай это помогает определить, возможно ли выполнение маршрута PostMessage / SendMessage.
->WM_RBUTTONDOWN (0x204)
->WM_RBUTTONUP (0x205)
->WM_MENUSELECT (0x11F)
<-WM_MENUSELECT (0x11F)
->WM_KEYDOWN (0x100)
->WM_MENUSELECT (0x11F)
<-WM_MENUSELECT (0x11F)
->WM_KEYUP (0x101)
Послесловие
Некоторое время я искал, пытаясь найти хорошие примеры PostMessages / SendMessages, используемых для такого рода выбора из контекстного меню, но ничего не нашел.
Спасибо за ваше время.
Текущий скрипт Autohotkey
#NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases.
SendMode Input ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir% ; Ensures a consistent starting directory.
; "CTRL + ALT + PAGEUP" for previous
^!PGUP::
{
DetectHiddenWindows, On
ControlSend, ahk_parent, ^{Left}, ahk_class SpotifyMainWindow
DetectHiddenWindows, Off
return
}
; "CTRL + ALT + PAGEDOWN" for next
^!PGDN::
{
DetectHiddenWindows, On
ControlSend, ahk_parent, ^{Right}, ahk_class SpotifyMainWindow
DetectHiddenWindows, Off
return
}
; "CTRL + ALT + HOME" for pause
^!Home::
{
DetectHiddenWindows, On
ControlSend, ahk_parent, {space}, ahk_class SpotifyMainWindow
DetectHiddenWindows, Off
return
}
; "CTRL + ALT + END" for info
^!End::
{
DetectHiddenWindows, On
WinGetTitle, spotify_playing, ahk_class SpotifyMainWindow
DetectHiddenWindows, Off
StringTrimLeft, trimmed_playing, spotify_playing, 10
StringReplace, replaced_playing, trimmed_playing, –, -, All
clipboard = %replaced_playing%
return
}
; "CTRL + ALT + UP" for volume up
^!Up::
{
DetectHiddenWindows, On
ControlSend, ahk_parent, ^{Up}, ahk_class SpotifyMainWindow
DetectHiddenWindows, Off
return
}
; "CTRL + ALT + DOWN" for volume down
^!Down::
{
DetectHiddenWindows, On
ControlSend, ahk_parent, ^{Down}, ahk_class SpotifyMainWindow
DetectHiddenWindows, Off
return
}
/*
PLAN: I want to make this star the current song if it's unstarred
NOTES:
WM_MENUSELECT for star seems to be item identifier 11, unstar is 12
Star -> WM_MENUSELECT (0x11F) | item identifier = 11 | flags = NONE | MF_HILITE
Unstar -> WM_MENUSELECT (0x11F) | item identifier = 12 | flags = NONE | MF_HILITE
*/
; "CTRL + ALT + INSERT" for starring the current song
^!Insert::
{
DetectHiddenWindows, On
DetectHiddenWindows, Off
return
}
controlclick x.. y..
также можно сделать с свернутой Spotify. Реалистичное мышление: если вы хотите сделать это вручную, вы должны увидеть, помечена ли уже песня. Итак, вы уже автоматизируете все, что есть. Если вы не можете обойтись без этого, подумайте о добавлении этих песен в новый настраиваемый список воспроизведения и добавьте их все в свои песни, прежде чем закрывать Spotify. - person phil294   schedule 18.01.2015