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