最新消息:20210816 当前crifan.com域名已被污染,为防止失联,请关注(页面右下角的)公众号

【已解决】C#的窗体程序中,想要获得(IE9)浏览器的进程,以及其下的对应某个子窗口

C# crifan 4361浏览 0评论

【问题】

一个C#中的窗体程序,想要获得浏览器,至少是IE浏览器,及以后可能支持的安全360浏览器等,获得其进程,然后进行后续处理(得到对应正在运行的WMP播放的歌曲的信息,并下载该歌曲)

【解决过程】

1.问题就是,想要获得浏览器的进程。

参考:C#通过API实现跨进程得到浏览器对象

拷贝了代码。

2.结果编译时发现找不到mshtml。

后来根据如何在C#添加MSHTML组件中的提示,去Reference->Add Reference->.NET中找到Microsoft.mshtml并添加进来,就可以了。

3.然后就去调试代码,但是始终返回的句柄是空,后来参考:FindWindow usage,去把:

IntPtr parentHWnd = downloadStMusic.FindWindow("IEFrame", windowName);

改为:
IntPtr parentHWnd = downloadStMusic.FindWindow("IEFrame", null);

然后返回的parentHWnd 才不会是空的句柄。

4.接下来想要获得对应的IE窗口中某个页面,比如打开的Songtaste的页面,但是不知道如何下手。

后来看到用C#调用Windows API和其它进程通信中提到了Spy++,然后就去VS 2010中打开Spy++,折腾了一会,也没搞懂,到底是如何去查到到对应的想要的页面的。

5.后来还是抛弃了FindWindow相关的代码。

然后参考:.net (c#)winform中操作ie窗口元素,先去Reference->Add Reference->Browse中添加

c:\windows\system32\SHDocVw.dll

然后再使用如下代码:

/* 获得所有ie进程。因为windows下资源窗口使用ie内核,所以不光是我们通常指的web浏览器,它还包括你打开我的电脑这样的窗口 */
SHDocVw.ShellWindows sws = new SHDocVw.ShellWindows();

/*遍历ie进程*/
foreach (SHDocVw.InternetExplorer iw in sws)
{
    /* 如果使用的窗口中正打开的是我的aaa.html
     * 我这里就没有对窗口类型进行检测了,因为我的aaa.html它一定是ie打开的。
     */
    string iePlayStMusicTitle = "songtaste——播放器";
    if (iw.LocationName == iePlayStMusicTitle)
    {
        // here can got the tab page of "songtaste——播放器"

        mshtml.HTMLDocument doc = (mshtml.HTMLDocument)iw.Document;
    }
}

是可以获得对应的Songtaste跳出的播放全部歌曲的那个页面,其标题是“songtaste——播放器”。

转载请注明:在路上 » 【已解决】C#的窗体程序中,想要获得(IE9)浏览器的进程,以及其下的对应某个子窗口

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
82 queries in 0.168 seconds, using 22.21MB memory