我正在尝试使用C#应用程序从我个人最喜欢的 Media Player Classic 中获取媒体信息。
假设我得到了我感兴趣的MPC-HC实例的窗口句柄,但是WM_GETTEXT
只获得了窗口标题。我对此并不满意。我还想获取播放状态(停止/暂停/播放),当前时间,总长度和文件路径。我应该能够从文件中获取所有其他东西,知道它的路径。
我首先想到的是使用 AutoIt窗口信息应用程序,它在我的可见文本标签中获取了我想要的东西,我可以使用它作为获取文本的工具,但我如何将 文本直接发送到我的C#应用程序进行解析?
我想找到一个不涉及干扰用户活动的解决方案,比如强行提起玩家的窗口。我只想获取当前时间,播放状态和完整文件路径到我的C#应用程序。有没有一种简单的方法可以做到这一点?
答案 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++探索其他子窗口,如下所示: