【背景】
C#程序中,已经获得了对应的IE浏览器的某个子页面:
【已解决】C#的窗体程序中,想要获得(IE9)浏览器的进程,以及其下的对应某个子窗口
现在希望获得该子页面中,包含的播放器插件WMP,获得其中正在播放的歌曲的信息:
【解决过程】
1.找到:mshtml.HTMLDocumentClass in C#,现在想到,是否可以从上述网页的源码中,找到对应播放器的元素,id等信息,然后看看是否可以获得对应的WMP插件的信息。
2.折腾后发现,貌似想要获得对应的插件WMP正在播放的歌曲的信息,好像比较麻烦。
所以,此处,暂时不弄这个了。
因为先说一下我的目的,是获得当前songtaste中正在播放歌曲的id即可,比如歌曲id是3028392,那么对应的歌曲地址就是:http://songtaste.com/song/3028392,然后我就可以去下载对应歌曲了,所以我下载到正在播放的歌曲,是主要目的,此处转为想办法去获得当前正在播放的歌曲的id即可。
3. 后来通过IE9的F12,去调试javascript发现,对应的保存当前正在播放歌曲的id是cur_sid这个变量,对应的保存所有当前打开的歌曲的id的列表,是变量arr_ids。
也可以通过对应的网页源码html中看到对应的值,比如:
var arr_ids = new Array(2988400,462078,1581014,3022259,3019660,3024942,3015928,1525636,2031060,3028392,1906378,2760214,3025862,155789,2472444,3028350,3027942,2957776,218793,3015580,2510328,1196346,3027329,1284399,3027284,3028381,2064629,1588508,0); var cur_sid = arr_ids[0];
所以,现在就是想办法,得到对应的cur_sid即可。
5.参考:C# webbrowser控件技巧(取得javascript变量值, 禁止显示脚本错误),最后是可以通过如下代码获得对应的cur_sid:
mshtml.HTMLDocument doc = (mshtml.HTMLDocument)iw.Document; IHTMLWindow2 vWindow = doc.parentWindow; Type vWindowType = vWindow.GetType(); object cur_sid = vWindowType.InvokeMember("cur_sid", BindingFlags.GetProperty, null, vWindow, new object[] { }); int curSongId = (int)cur_sid;
但是此处测试结果是,cur_sid始终是不变的,即对于我当前播放歌曲换成下一首了,该值还是不变,所以不是我要的效果。
6.后来通过IE9的F12调试和查看网页源码,最后找到了,可以通过获得元素songid获得当前正在播放的歌曲,对于获得当前songid的代码如下:
mshtml.HTMLDocument doc = (mshtml.HTMLDocument)iw.Document; string songidStr = ((HTMLInputTextElement)doc.getElementById("songid")).value; string songUrl = "http://songtaste.com/song/" + songidStr + "/";
【总结】
获得对应的mshtml的HTMLDocument类型变量后:
1.想要获得网页中某个值,可以通过对应的:
(HTMLInputTextElement)doc.getElementById("xxx")).value
来获得。
2.想要获得网页中某个javascript中的变量的话,可以通过这样获得:
IHTMLWindow2 vWindow = doc.parentWindow; Type vWindowType = vWindow.GetType(); object xxx = vWindowType.InvokeMember("xxx", BindingFlags.GetProperty, null, vWindow, new object[] { });
转载请注明:在路上 » 【workaround】C#中,已获得IE9浏览器的子页面,如何获得子页面中的播放器插件(WMP)