Как запустить песню Spotify с помощью Autohotkey, пока она свернута?

Как пометить песню 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.

  1. Щелкните правой кнопкой мыши обложку альбома в левом нижнем углу и воспользуйтесь опцией контекстного меню со звездочкой.
  2. Щелкните правой кнопкой мыши песню в списке воспроизведения и используйте опцию контекстного меню со звездочкой.

Чтобы сделать вещи неудобными, пункт меню со звездочкой заменен параметром меню со звездочкой в ​​том же месте, если что-то уже помечено. У них также есть такая же горячая клавиша, когда меню открыто (клавиша 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 
}

person bluesatin    schedule 27.05.2013    source источник
comment
Если вам не нужно знать, помечена ли уже песня звездочкой, controlclick x.. y.. также можно сделать с свернутой Spotify. Реалистичное мышление: если вы хотите сделать это вручную, вы должны увидеть, помечена ли уже песня. Итак, вы уже автоматизируете все, что есть. Если вы не можете обойтись без этого, подумайте о добавлении этих песен в новый настраиваемый список воспроизведения и добавьте их все в свои песни, прежде чем закрывать Spotify.   -  person phil294    schedule 18.01.2015


Ответы (2)


Тот, который я сейчас использую во время игр, довольно прост:

MouseGetPos, x, y, origwin
WinActivate, ahk_class SpotifyMainWindow
click 183, 1000 ;
WinActivate, ahk_id %origwin%
MouseMove, %x%, %y%

Аккуратная замена вашего другого кода; Spotify реагирует на кнопки мультимедиа, поэтому они работают очень хорошо:

^!Left::Media_Prev
^!Right::Media_Next
^!Up::Volume_Up
^!Down::Volume_Down
^!Space::Media_Play_Pause

Изменить: Spotify изменили макет. Знак + перемещается вместе с названием песни. Чтобы он работал более единообразно, я изменил функцию, щелкнув правой кнопкой мыши и выбрав «Сохранить в свою музыку».

FavouriteSpotifySong()
{
    WinGetPos, , , SPOTIFY_X_AXIS, SPOTIFY_Y_AXIS, ahk_class SpotifyMainWindow
    yPos := SPOTIFY_Y_AXIS - 30
    ControlClick, X25 Y%yPos%, ahk_class SpotifyMainWindow,, RIGHT
    Sleep 75
    yPos -= 54
    ControlClick, X33 Y%yPos%, ahk_class SpotifyMainWindow
}
person nelsontruran    schedule 26.10.2016

SpotifyLove(flag)
{            
WinGetActiveTitle, CurOpen
MouseGetPos, MouseX, MouseY

IfWinExist ahk_exe Spotify.exe ; check if spotify is open
    winactivate ahk_exe Spotify.exe
else
    return
WinWait ahk_exe Spotify.exe

Click, 65 940 0; Spotify has a 60x60 pixel window with the menu in the top left corner. I have not find another way to activate the the main window except for this click. Any other solutions to are much appreciated.

WinGetPos, X, Y, W, H, A ; get the dimensions of the spotify window

; start searching for image in a rectangle. The first point of the rectangle X1,Y1 is 100 pixels above the bottom left corner. The other point of the rectangle X2,Y2 is 600 pixels right of the left edge and along the bottom of the window.

X1 := 0
X2 := 600
Y1 := H - 100
Y2 := H

; imagesearch is really crappy. *70 gives the function some leeway to find the right image in the window. We are searching for the heart. 

ImageSearch, OutputVarX, OutputVarY, X1, Y1, X2, Y2, *70 Z:\Pictures\heart.jpg

; click on heart if we like the song, click on the dislike button and "i dont like this song" otherwise.

A := OutputVarX+15
B := OutputVarY+15
if (flag == 1)
{
    Click, %A% %B%
} 
else {
    HateX := OutputVarX+50
    DontLikeSongX := HateX+10
    DontLikeSongY := OutputVarY-10
    Click, %HateX%, %OutputVarY%
    Sleep, 200
    Click, %DontLikeSongX%, %DontLikeSongY%
}

; return to previous window with the same mouse position.
WinRestore, %CurOpen%
WinMaximize, %CurOpen%
WinActivate, %CurOpen%
MouseMove, %MouseX%, %MouseY% 
}

^+S::
SpotifyLove(1)
Return

;^+d::
;SpotifyLove(0)
;Return

Я давно нашел это на форуме AutoHotKey, а недавно вернулся в AutoHotkey, и мне пришлось заново настроить и потратить час, чтобы все исправить. Он все еще не идеален, поскольку использует ImageSearch. Обязательно возьмите фрагмент пустого сердца из приложения Spotify и укажите его путь к JPG (сделайте как можно меньше границ вокруг изображения скриншота пустого сердца) и укажите путь к нему. Это происходит правильно примерно в 95% случаев, но также не устраняет проблему открытия приложения Spotify на короткое время, поэтому он не так полезен во время игры. Я прокомментировал часть того, что песня не понравилась, потому что она вообще не работала.

Я установил ярлык: Ctrl + Shift + S

РЕДАКТИРОВАТЬ: добавление ссылки на empty_heart из приложения Spotify для Windows. (https://imgur.com/a/eDWL1Zl)

Имейте в виду, что, поскольку положение сердца постоянно меняется для разной длины заголовка в Spotify, точность составляет всего 95% или около того.

Текущий пользовательский интерфейс Spotify на момент публикации также должен быть виден по указанной выше ссылке imgur.

person outcast_dreamer    schedule 12.07.2021