如何使用Autohotkey最小化Spotify歌曲?

blu*_*tin 6 autohotkey hotkeys minimized spotify

如何在Spotify歌曲最小化时为其加注星标?

好的,即使应用程序窗口当前处于活动状态,Windows上的Spotify应用程序也没有内置的全局热键和非常基本的热键支持.令人沮丧地"主演"当前播放的歌曲没有键盘快捷键,即使窗口处于活动状态.

所以我有一个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
}
Run Code Online (Sandbox Code Playgroud)

我修改了一些隐藏在互联网上的现有脚本.其中的源代码可以在源代码的顶部找到,如果有人想在不显示上下文菜单的情况下尝试完全工作,它可能会有所帮助.


如何在正常使用应用程序时为歌曲加注星标?

在Spotify中似乎只有2条路线可以为一首歌加注星标.

  1. 右键单击左下方的专辑封面,然后使用星形上下文菜单选项.
  2. 右键单击播放列表列表中的歌曲,然后使用星形上下文菜单选项.

为了让事情变得尴尬,如果某些内容已经加星标,那么星形菜单选项将替换为完全相同位置的unstar菜单选项.当菜单打开时(t键),它们也具有相同的快捷键.因此,如果没有先进行某种检查,您不能只进行盲目菜单选择.

那么我们可以采取哪些可能的路线?

右键单击左下方的专辑封面是唯一可行的路线.

如果我们可以在最小化的情况下从上下文菜单中读取文本,我们可以判断某些内容是否已经由"star"到"unstar"的文本更改加以加注.在那次测试之后,我们可以决定是否按T键实际为歌曲加注星标.

我还花了一些时间与Window Detective一起看看我是否可以发送一个相对简单的PostMessage/SendMessage来为这首歌加注星标.但我的经验很少,我不知道如何将它们连在一起以获得我想要的结果.

我发现star和unstar上下文菜单选项实际上是不同的:

Star   -> WM_MENUSELECT (0x11F) | item identifier = 11 | flags = NONE | MF_HILITE
Unstar -> WM_MENUSELECT (0x11F) | item identifier = 12 | flags = NONE | MF_HILITE
Run Code Online (Sandbox Code Playgroud)

但是我不知道如何实际链接PostMessages/SendMessages以打开菜单,然后只选择项目#11然后按回车键.

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)
Run Code Online (Sandbox Code Playgroud)

后记

我已经搜索了一段时间试图找到用于执行此类上下文菜单选择但未能找到任何内容的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 
}
Run Code Online (Sandbox Code Playgroud)

nel*_*ran 4

我目前玩游戏时使用的非常简单:

MouseGetPos, x, y, origwin
WinActivate, ahk_class SpotifyMainWindow
click 183, 1000 ;
WinActivate, ahk_id %origwin%
MouseMove, %x%, %y%
Run Code Online (Sandbox Code Playgroud)

完美替代您的其他代码;Spotify 对媒体按钮做出响应,因此这些按钮非常有用:

^!Left::Media_Prev
^!Right::Media_Next
^!Up::Volume_Up
^!Down::Volume_Down
^!Space::Media_Play_Pause
Run Code Online (Sandbox Code Playgroud)

编辑: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
}
Run Code Online (Sandbox Code Playgroud)