为什么我对WinGetTitle的调用返回一个空字符串?

时间:2019-02-07 09:34:17

标签: autohotkey

我正在构建一个脚本,如果我在锁定工作站时正在播放音乐,它将暂停我的音乐。我使用spotify,通过检查窗口标题可以很容易地获得播放状态。当不播放任何内容时,其标题仅为“ Spotify”,但在播放媒体时,窗口标题将更改为当前播放的曲目的标题。我可以使用Window Spy看到它。

我尝试使用WinGetTitle, title, ahk_exe Spotify.exe查找Spotify窗口并读取其标题,该窗口应将标题写入变量title中。这不起作用,title是一个空字符串。有趣的是,如果将Spotify窗口最小化,它将起作用。

#L::
{
   WinGetTitle, title, ahk_exe Spotify.exe
   if(title != "Spotify")
   {
      Send {Media_Play_Pause}
   }
   DllCall("LockWorkStation")
   return
}

这是在Windows 10上。WinGetClass, c, ahk_exe Spotify.exe可以正确找到窗口,但是类名是Chrome_WidgetWin0,因为我猜该应用程序是用Electron编写的。其他电子应用似乎具有相同的类名,只是在末尾增加数字。

我想要的是一种挂接到Windows Spotify用于报告其当前播放状态的Windows API的方法,因为Windows 10将其识别为媒体应用程序,并在任务栏中的选项卡中添加了播放/暂停按钮,并且在Windows音量控制面板中。

谢谢

1 个答案:

答案 0 :(得分:0)

可能存在多个属于进程“ Spotify.exe”的“ Chrome_WidgetWin0”类窗口。

尝试一下:

#IfWinExist ahk_exe Spotify.exe

    #l::
        WinGet, id, list, ahk_exe  Spotify.exe
        Loop, %id%
        {
            this_ID := id%A_Index%
            WinGetTitle, title, ahk_id %this_ID%
            If (title = "")
                continue
            If (title != "Spotify")
            {
                Send {Media_Play_Pause}
                    break
            }   
        }
        DllCall("LockWorkStation")
    return

#IfWinExist

编辑:要查明它是否确实有效,请运行以下测试:

#IfWinExist ahk_exe Spotify.exe

    #q:: ; Win+Q
        WinGet, id, list, ahk_exe  Spotify.exe
        Loop, %id%
        {
            this_ID := id%A_Index%
            WinGetTitle, title, ahk_id %this_ID%
            ; MsgBox, "%title%"
            If (title = "")
                continue
            MsgBox, "%title%"
            If (title != "Spotify")
            {
                Send {Media_Play_Pause}
                    break
            }   
        }
    return

#IfWinExist