Winapi media player classic-以编程方式跳转到视频/音频中的点

Winapi media player classic-以编程方式跳转到视频/音频中的点,winapi,controls,media-player,autohotkey,Winapi,Controls,Media Player,Autohotkey,在Media Player Classic中,我找到了一种以编程方式跳转到视频/音频中某个点的方法,避免了“转到…”框。 跳跃距离在选项中可用→ 调整, 和HKEY\U CURRENT\U USER\Software\MPC-HC\MPC-HC\Settings (JumpDistL/JumpDistM/JumpDistS) 我要做的是在Media Player Classic的地址空间中查找跳转距离,并设置大跳转距离的值,例如 如果你把它应用到经过的时间上,你会得到想要的时间 然后,我发送一个

在Media Player Classic中,我找到了一种以编程方式跳转到视频/音频中某个点的方法,避免了“转到…”框。 跳跃距离在选项中可用→ 调整, 和
HKEY\U CURRENT\U USER\Software\MPC-HC\MPC-HC\Settings
JumpDistL
/
JumpDistM
/
JumpDistS

我要做的是在Media Player Classic的地址空间中查找跳转距离,并设置大跳转距离的值,例如 如果你把它应用到经过的时间上,你会得到想要的时间

然后,我发送一个带有参数
903
/
904
WM_命令
消息(全部通过自动热键。我通过检索/解析编辑控件的内容获取经过的时间。)

因为跳跃是相对于当前点的,所以不精确, 在正确时间的一秒钟内到达,但没有到达 每次都在同一点

有没有更直接的方法来实现这一点,如果没有, 是否有媒体播放器是经典用户/程序员 在论坛上讨论,引入新的<代码> WMX命令< /代码>消息 允许跳转到点(以毫秒为单位), 或者检索列出的数值 (
状态
位置
持续时间
音量级
静音
播放速率
重新加载时间
)。
(找到的方法速度太慢,无法准确获取时间,需要设置特殊选项)。

多亏了问题下方wOxxOm的消息, 我已经能够创建这个自动热键脚本, 这解决了我原来的问题: 要以编程方式设置Media Player Classic中的运行时间, 直接,无需使用
转到…

它还解决了检索问题 有关视频的信息

;==================================================

^q:: ;start MPC API
hWnd := A_ScriptHwnd+0
OnMessage(WM_COPYDATA:=74, "On_WM_COPYDATA")
;64-bit
Run, "C:\Program Files (x86)\K-Lite Codec Pack\MPC-HC64\mpc-hc64.exe" /slave %hWnd%
;32-bit
;Run, "C:\Program Files (x86)\K-Lite Codec Pack\MPC-HC\mpc-hc.exe" /slave %hWnd%
Return

;==================================================

^w:: ;display information
Send(vMPCApiHWnd, 0xA0003004, "") ;CMD_GETCURRENTPOSITION := 0xA0003004

vElapsed := 19990101
vDuration := 19990101
vElapsed += vMPCApiCurrent, S
vDuration += vMPCApiDuration, S

if (vMPCApiCurrent >= 3600) OR (vMPCApiDuration >= 3600)
vFormat := "HH:mm:ss"
else
vFormat := "mm:ss"

FormatTime, vElapsed, %vElapsed%, %vFormat%
FormatTime, vDuration, %vDuration%, %vFormat%

SplitPath, vMPCApiPath, vName, vDir, vExt, vNameNoExt, vDrive

vText = ;continuation section
(
title: %vMPCApiTitle%
author: %vMPCApiAuthor%
description: %vMPCApiDesc%
name: %vName%
path: %vMPCApiPath%
elapsed: %vElapsed% (%vMPCApiCurrent%)
duration: %vDuration% (%vMPCApiDuration%)
)

MsgBox %vText%
Return

;==================================================

#IfWinActive, ahk_class MediaPlayerClassicW
0:: ;skip to point
1::
2::
3::
4::
5::
6::
7::
8::
9::
vNum := SubStr(A_ThisHotkey, 1-1)
vElapsed2 := Round(vMPCApiDuration*(vNum/10))

Send(vMPCApiHWnd, 0xA0002000, "" vElapsed2) ;CMD_SETPOSITION := 0xA0002000
Return
#IfWinActive

;==================================================

On_WM_COPYDATA(wParam, lParam, msg, hwnd)
{
global vMPCApiHWnd
global vMPCApiTitle
global vMPCApiAuthor
global vMPCApiDesc
global vMPCApiPath
global vMPCApiDuration
global vMPCApiCurrent

dwData := NumGet(lParam+0, 0)
cbData := NumGet(lParam+A_PtrSize)
lpData := NumGet(lParam + 2*A_PtrSize)
lpData := StrGet(lpData)

if (dwData = 0x50000000) ;CMD_CONNECT := 0x50000000
{
vMPCApiHWnd := lpData
WinGetClass, vWinClass, ahk_id %vMPCApiHWnd%
if (vWinClass = "MediaPlayerClassicW")
MsgBox, , , MPC API on, 3
}

if (dwData = 0x50000003) ;CMD_NOWPLAYING := 0x50000003
{
StringSplit, lpData, lpData, |
vMPCApiTitle := lpData1
vMPCApiAuthor := lpData2
vMPCApiDesc := lpData3
vMPCApiPath := lpData4
vMPCApiDuration := lpData5
}

if (dwData = 0x50000007) ;CMD_CURRENTPOSITION := 0x50000007
vMPCApiCurrent := lpData

Return true
}

;==================================================

Send(Hwnd, dwData, lpData)
{
static WM_COPYDATA := 0x4a

VarSetCapacity(COPYDATASTRUCT, 3*A_PtrSize, 0)
cbData := (StrLen(lpData) + 1) * (A_IsUnicode ? 2 : 1)
NumPut(dwData, COPYDATASTRUCT, 0)
NumPut(cbData, COPYDATASTRUCT, A_PtrSize)
NumPut(&lpData, COPYDATASTRUCT, 2*A_PtrSize)

SendMessage, % WM_COPYDATA, % A_ScriptHwnd , &COPYDATASTRUCT,, % "ahk_id " Hwnd
return ErrorLevel == "FAIL" ? false : true
}

;==================================================

;USEFUL LINKS
;Sending Strings Via SendMessage - Ask for Help - AutoHotkey Community
;https://autohotkey.com/board/topic/98334-sending-strings-via-sendmessage/

;Media Player Classic - Homecinema MPC remote API (via WM_COPYDATA) - AutoIt Example Scripts - AutoIt Forums
;https://www.autoitscript.com/forum/topic/85354-media-player-classic-homecinema-mpc-remote-api-via-wm_copydata/

;mpcapi.h
;https://raw.githubusercontent.com/jeeb/mpc-be/master/src/apps/mplayerc/mpcapi.h

;winapi - media player classic - jump to point in video/audio programmatically - Stack Overflow
;http://stackoverflow.com/questions/41310778/media-player-classic-jump-to-point-in-video-audio-programmatically

;==================================================
热键是:
-Ctrl+Q启动MPC API,
-Ctrl+W以检索信息,
-数字键可在视频的中途跳转

;==================================================

^q:: ;start MPC API
hWnd := A_ScriptHwnd+0
OnMessage(WM_COPYDATA:=74, "On_WM_COPYDATA")
;64-bit
Run, "C:\Program Files (x86)\K-Lite Codec Pack\MPC-HC64\mpc-hc64.exe" /slave %hWnd%
;32-bit
;Run, "C:\Program Files (x86)\K-Lite Codec Pack\MPC-HC\mpc-hc.exe" /slave %hWnd%
Return

;==================================================

^w:: ;display information
Send(vMPCApiHWnd, 0xA0003004, "") ;CMD_GETCURRENTPOSITION := 0xA0003004

vElapsed := 19990101
vDuration := 19990101
vElapsed += vMPCApiCurrent, S
vDuration += vMPCApiDuration, S

if (vMPCApiCurrent >= 3600) OR (vMPCApiDuration >= 3600)
vFormat := "HH:mm:ss"
else
vFormat := "mm:ss"

FormatTime, vElapsed, %vElapsed%, %vFormat%
FormatTime, vDuration, %vDuration%, %vFormat%

SplitPath, vMPCApiPath, vName, vDir, vExt, vNameNoExt, vDrive

vText = ;continuation section
(
title: %vMPCApiTitle%
author: %vMPCApiAuthor%
description: %vMPCApiDesc%
name: %vName%
path: %vMPCApiPath%
elapsed: %vElapsed% (%vMPCApiCurrent%)
duration: %vDuration% (%vMPCApiDuration%)
)

MsgBox %vText%
Return

;==================================================

#IfWinActive, ahk_class MediaPlayerClassicW
0:: ;skip to point
1::
2::
3::
4::
5::
6::
7::
8::
9::
vNum := SubStr(A_ThisHotkey, 1-1)
vElapsed2 := Round(vMPCApiDuration*(vNum/10))

Send(vMPCApiHWnd, 0xA0002000, "" vElapsed2) ;CMD_SETPOSITION := 0xA0002000
Return
#IfWinActive

;==================================================

On_WM_COPYDATA(wParam, lParam, msg, hwnd)
{
global vMPCApiHWnd
global vMPCApiTitle
global vMPCApiAuthor
global vMPCApiDesc
global vMPCApiPath
global vMPCApiDuration
global vMPCApiCurrent

dwData := NumGet(lParam+0, 0)
cbData := NumGet(lParam+A_PtrSize)
lpData := NumGet(lParam + 2*A_PtrSize)
lpData := StrGet(lpData)

if (dwData = 0x50000000) ;CMD_CONNECT := 0x50000000
{
vMPCApiHWnd := lpData
WinGetClass, vWinClass, ahk_id %vMPCApiHWnd%
if (vWinClass = "MediaPlayerClassicW")
MsgBox, , , MPC API on, 3
}

if (dwData = 0x50000003) ;CMD_NOWPLAYING := 0x50000003
{
StringSplit, lpData, lpData, |
vMPCApiTitle := lpData1
vMPCApiAuthor := lpData2
vMPCApiDesc := lpData3
vMPCApiPath := lpData4
vMPCApiDuration := lpData5
}

if (dwData = 0x50000007) ;CMD_CURRENTPOSITION := 0x50000007
vMPCApiCurrent := lpData

Return true
}

;==================================================

Send(Hwnd, dwData, lpData)
{
static WM_COPYDATA := 0x4a

VarSetCapacity(COPYDATASTRUCT, 3*A_PtrSize, 0)
cbData := (StrLen(lpData) + 1) * (A_IsUnicode ? 2 : 1)
NumPut(dwData, COPYDATASTRUCT, 0)
NumPut(cbData, COPYDATASTRUCT, A_PtrSize)
NumPut(&lpData, COPYDATASTRUCT, 2*A_PtrSize)

SendMessage, % WM_COPYDATA, % A_ScriptHwnd , &COPYDATASTRUCT,, % "ahk_id " Hwnd
return ErrorLevel == "FAIL" ? false : true
}

;==================================================

;USEFUL LINKS
;Sending Strings Via SendMessage - Ask for Help - AutoHotkey Community
;https://autohotkey.com/board/topic/98334-sending-strings-via-sendmessage/

;Media Player Classic - Homecinema MPC remote API (via WM_COPYDATA) - AutoIt Example Scripts - AutoIt Forums
;https://www.autoitscript.com/forum/topic/85354-media-player-classic-homecinema-mpc-remote-api-via-wm_copydata/

;mpcapi.h
;https://raw.githubusercontent.com/jeeb/mpc-be/master/src/apps/mplayerc/mpcapi.h

;winapi - media player classic - jump to point in video/audio programmatically - Stack Overflow
;http://stackoverflow.com/questions/41310778/media-player-classic-jump-to-point-in-video-audio-programmatically

;==================================================
有用链接:

通过SendMessage发送字符串-请求帮助-自动热键社区

Media Player Classic-Homecinema MPC远程API(通过WM_COPYDATA)-AutoIt示例脚本-AutoIt论坛

mpcapi.h

它已经通过WM_COPYDATA实现,请参阅源代码中的mpcapi.h,您可以将其rip/转换为AHK,甚至可以找到现有的库。由于视频数据的编码方式,您不太可能以毫秒精度跳到任意位置。无法在关键帧之间重新启动播放。如果禁用“快速搜索”选项(也在“调整”中),是否会产生差异?此选项使MPC跳转到关键帧,而不是将视频从最近的关键帧前进到中间的选定点keyframes@wOxxOm非常感谢您的回复。你是AutoHotkey的InBuf的作者,不是吗!这对我非常有用。而且是自动热键和自动IT方面的专家?很高兴您能进入我的页面。@i根据视频和设置,MPC允许您跳转到特定的关键帧或跳转间隔超过一分钟的点。-我的问题是,
转到…
将跳转到一个一致点,但需要一个MsgBox被取消,而我的解决方法绕过了MsgBox,但不会跳转到
转到…
的确切点。