media-player - 在 Media Player Classic - 使用 AutoHotkey 的家庭影院中检索播放/暂停状态的更可靠方法?

标签 media-player autohotkey

我一直在使用 MPC-HC 窗口的状态文本来确定视频是正在播放还是暂停。但是,在全屏模式下或隐藏状态栏时,状态文本不会更新。有人向 MPC-HC 团队指出了这个错误,但尚未解决:https://trac.mpc-hc.org/ticket/5640

我已经尝试使用 MPC-HC API 获取媒体播放器的状态,但这需要我使用/slave 命令运行 MPC-HC 才能触发 WM_COPYDATA,这是我不想要的。

这里有关于该方法的更多信息:

media player classic - jump to point in video/audio programmatically

https://www.autoitscript.com/forum/topic/85354-media-player-classic-homecinema-mpc-remote-api-via-wm_copydata/

这是我现在使用的代码。如果状态栏不可见,则失败。

IsMediaPlayerClassicPlaying() {

   ControlGetText, vPlayPause, Static3 , ahk_class MediaPlayerClassicW

   If InStr(vPlayPause, "Playing") 
       Return True
   Else
       Return False

我希望函数在 MPC 播放视频时返回 True,但它仅在状态栏可见时有效。如果不可见,MPC 似乎不会更新状态栏文本(播放/暂停)。

最佳答案

使用音频端点的唯一缺点是视频没有声音。没有静音,没有音轨。

所以,我可以想到另外两种方法。

使用 MPC API:您不需要使用 /slave 命令行运行 MPC。即使您已经在运行 MPC,它也只需要执行带有 /slave 开关的 Run 命令来告诉 MPC AHK 将与其通信。

然后monitor会在每次播放状态改变的时候更新一个全局变量。无法直接查询状态,只能更改。

要对此进行测试,请打开 MPC 和任何视频,然后打开此 AHK 脚本。 F1 将连接,F2 将为您提供状态。警告:连接后状态不会更新,只有在第一次状态更改后变量才有意义。

global isMediaPlayerClassicPlaying := -1

OnMessage(WM_COPYDATA := 0x4A, "WM_COPYDATA")

; Connect MPC with AHK
F1::Run % "mpc-hc64.exe /slave " A_ScriptHwnd + 0, D:\Apps\Media Player Classic

F2::MsgBox % isMediaPlayerClassicPlaying

WM_COPYDATA(wParam, lParam)
{
    dwData := NumGet(lParam + 0)
    lpData := NumGet(lParam + A_PtrSize * 2)
    lpData := StrGet(lpData)
    if (dwData = 0x50000000) ; CMD_CONNECT := 0x50000000
    {
        WinGetClass vWinClass, % "ahk_id" lpData
        if (vWinClass = "MediaPlayerClassicW")
            OutputDebug MPC API on
    }
    if (dwData = 0x50000002) ; CMD_PLAYMODE := 0x50000002
        isMediaPlayerClassicPlaying := (lpData = 0)
    return true
}

第二个选项是最可靠的,但有点慢(大约需要 1 秒)。在选项中启用 web interface ,然后使用这个脚本:

F1::MsgBox % IsMediaPlayerClassicPlaying()
IsMediaPlayerClassicPlaying()
{
    url := "http://localhost:13579/variables.html"
    whr := ComObjCreate("WinHttp.WinHttpRequest.5.1")
    whr.Open("GET", url, false)
    whr.Send()
    RegExMatch(whr.ResponseText, "(?<=state..)\d", state)
    return state = 2
}

关于media-player - 在 Media Player Classic - 使用 AutoHotkey 的家庭影院中检索播放/暂停状态的更可靠方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57540249/

相关文章:

java - 音频的停止和播放按钮 (Android)

Autohotkey 将 Win-Z 映射到 CTRL-SHIFT-f

windows - Windows PC上的自动热键重新映射Apple Mac键盘

autohotkey - 数字的值没有从字典中提取

javascript - 测试innerHTML的部分字符串

android - 在 Android 中,如何同步录音和同步播放?

java - 如何正确使用JavaFX MediaPlayer?

javascript - 将网页中的npapi插件对象从一个div移动到另一个div,为什么插件会销毁并重新创建?[chrome,FireFox]

java - 音频文件未在Java中播放

windows - 选择 Windows 自动化脚本语言。 AutoIt 与 Autohotkey