Как получить важную информацию о мультимедиа из экземпляра mpc-hc?

Я пытаюсь получить информацию о мультимедиа из моего любимого Media Player Classic с помощью приложения на C#.

Предположим, я получил дескриптор окна экземпляра MPC-HC, который мне интересен, но WM_GETTEXT получает только заголовок окна. Я не удовлетворен только этим. Я также хочу получить состояние воспроизведения (остановлено / приостановлено / воспроизведение), текущее время, общую длину и путь к файлу. Я должен быть в состоянии получить все другие вещи из файла, зная его путь.

Первое, что я подумал, - это использование приложения AutoIt Window Info, которое дает мне именно то, что мне нужно, на вкладке " Видимый текст ", и я согласен с тем, чтобы использовать его как инструмент для получения текста, но как мне получить этот текст напрямую? в мое приложение C# для разбора?

Я хотел бы найти решение, которое не связано с вмешательством в деятельность пользователя, например, принудительное отображение окна игрока. Я просто хочу узнать текущее время, состояние воспроизведения и полный путь к файлу в моем приложении C#. Есть ли простой способ сделать это?

2 ответа

Решение

Я обнаружил, что, включив веб-интерфейс MPC-HC, появляется хорошая страница со всей необходимой мне статистикой текущего игрока по этому адресу: http://localhost:13579/variables.html (13579 является портом по умолчанию, но вы можете изменить его в настройках). Установите флажок Разрешить доступ только с локального хоста для защиты ваших тайных музыкальных желаний;)

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>

Вы можете получить необходимую информацию, используя информацию, полученную из дочерних окон, посмотрите на 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++, например:

введите описание изображения здесь

Другие вопросы по тегам