如何从mpc-hc实例中获取必要的媒体信息?

时间:2014-02-07 05:45:50

标签: c# winforms

我正在尝试使用C#应用程序从我个人最喜欢的 Media Player Classic 中获取媒体信息。

假设我得到了我感兴趣的MPC-HC实例的窗口句柄,但是WM_GETTEXT只获得了窗口标题。我对此并不满意。我还想获取播放状态(停止/暂停/播放),当前时间,总长度和文件路径。我应该能够从文件中获取所有其他东西,知道它的路径。

我首先想到的是使用 AutoIt窗口信息应用程序,它在我的可见文本标签中获取了我想要的东西,我可以使用它作为获取文本的工具,但我如何将 文本直接发送到我的C#应用​​程序进行解析?

我想找到一个不涉及干扰用户活动的解决方案,比如强行提起玩家的窗口。我只想获取当前时间,播放状态和完整文件路径到我的C#应用​​程序。有没有一种简单的方法可以做到这一点?

2 个答案:

答案 0 :(得分:5)

我发现通过启用MPC-HC网络界面,会显示一个很好的页面,其中包含我在此地址所需的所有当前玩家的统计数据:http://localhost:13579/variables.html(13579是默认端口,但您可以在选项)。检查仅允许从localhost访问以保护您的秘密音乐欲望;)

该页面上的HTML有点像这样:

<html>
<head>
    <title>MPC-HC WebServer - Variables</title>
    <meta http-equiv="content-type" content="text/html; charset=utf-8">
    <link rel="stylesheet" type="text/css" href="default.css">
</head>
<body>
    <p id="filepatharg">C:\music.mp3</p>
    <p id="filepath">C:\music.mp3</p>
    <p id="filedirarg">C:\</p>
    <p id="filedir">C:\</p>
    <p id="state">1</p>
    <p id="statestring">Paused</p>
    <p id="position">85918</p>
    <p id="positionstring">00:01:25</p>
    <p id="duration">284525</p>
    <p id="durationstring">00:04:44</p>
    <p id="volumelevel">50</p>
    <p id="muted">0</p>
    <p id="playbackrate">1</p>
    <p id="reloadtime">0</p>
</body>

答案 1 :(得分:1)

您可以使用从子窗口中检索到的信息获取所需信息,查看EnumChildWindows函数,以下是演示此类行为的代码段:

 class Program
    {
        public delegate bool WindowEnumDelegate(IntPtr hwnd,
                                                 int lParam);

        [DllImport("user32.dll")]
        public static extern int EnumChildWindows(IntPtr hwnd,
                                                  WindowEnumDelegate del,
                                                  int lParam);

        [DllImport("user32.dll")]
        public static extern int GetWindowText(IntPtr hwnd,
                                               StringBuilder bld, int size);

        static void Main(string[] args)
        {

            var mainWindowHandle = Process.GetProcessesByName("mpc-hc").First().MainWindowHandle;
            var list = new List<string>();
            EnumChildWindows(mainWindowHandle, (hwnd, param) =>
                                               {
                                                   var bld = new StringBuilder(256);
                                                   GetWindowText(hwnd, bld, 256);
                                                   var text = bld.ToString();
                                                   if (!string.IsNullOrEmpty(text))
                                                       list.Add(text);

                                                   return true;
                                               }, 0);

            Console.WriteLine("length={0}", list[0]);
            Console.WriteLine("state={0}", list[1]);
            Console.WriteLine("bitrate={0}", list[5]);
            Console.WriteLine("name={0}", list[7]);

            Console.WriteLine("Press enter to exit");
            Console.ReadLine();
        }
    }

您还可以使用spy++探索其他子窗口,如下所示:

enter image description here