I Really Follow this Blog

你确定要离开这个网页浏览?ㄚ琪发现了程式无法真正的成为别人Goolge Friend Connect的朋友,ㄚ琪苦恼了很多天,头发可能又多掉了几根,这几天不但很虔诚地做祷告,而且读经文也很用心,主要是为了个人的智慧目前不足以克服程式的问题,终于经过了3天的祈祷,圣灵给了我一个灵感,要我再细读一次我所Google到的这一篇c# webbrowser跨域存取iframe的方法,里头所带出的一篇原文 When IHTMLWindow2.document throws UnauthorizedAccessException,ㄚ琪首先碰到的第一个问题就是,Google Blogger里头有很深的Ajax程式内嵌在页面中,每个Gadget(小工具)里头可能都会有javascript、Ajax跟iframe的元素标签在里面执行着,这让采矿的程式很难挖,因为ㄚ琪的程式一开始无法挖到iframe里头的资料,而这个症结点在于微软的webbrowser的元件无法跨网域的处理frame内的资料,一开始看这篇文章时,因为我没有"Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))"这样的错误,所以就放弃阅读了,但是到最后去看微软的MSDN才发现到原来跨网域的frame处理学问很大,牵涉到安全的问题,所以不开放让你用,而且Goolge的时候,也很难找到处理的方法,说真的,可能这一篇是唯一的解法。

我直接拿了原始码来用:

using System.Reflection;
using mshtml;
HtmlDocument main_formDoc = webBrowser1.Document;
IHTMLDocument2 main_mshtmlIHTMLDoc = (IHTMLDocument2)main_formDoc.DomDocument;
Object frame_index = 1;
IHTMLWindow2 target_mshtmlIHTMLWindow = (IHTMLWindow2)main_mshtmlIHTMLDoc.frames.item(ref frame_index);
IHTMLDocument2 target_mshtmlIHTMLDoc = CodecentrixSample.CrossFrameIE.GetDocumentFromWindow(target_mshtmlIHTMLWindow);

再加上CodeCentrix所附的http://www.codecentrix.com/blog/wnd2doc_csharp/GetDocumentFromWindowCsharp.zip里头编译的Interop.SHDocVw.dll跟CodecentrixSample.dll来用,后来我发现我不会用,索性直接拿他的程式码来改,Yes!终于可行,呼,这一个铁板,ㄚ琪弄到昨天才做好,花了很多天,很累,挫折感也很大,不可天可怜见,还是克服了这个难题!

再来就是要模拟点击Follow这个看起来是按钮,可是它其实是用javascript跟Ajax产生的

<div jstcache="0" class="gfc-icon">Follow</div>

的这样语法,你可以参考Friend Connect的API说明可以了解,ㄚ琪一开始没办法模拟点击这个按钮,所以改采点击Sign in的连结,这一次处理的时间较短,很快就可以点击出另一个视窗,注意这个连结也不是真的连结,而是

带有 <a jstcache="57" href="javascript:void(0);" jscontent="MSG_SIGN_IN" jsvalues="$h:handle(this,’signin’)">Sign in</a>,这样的Javascript跟Ajax的语法,但是还好mshtml.IHTMLElement可以处理。

接下来的挑战就是处理点击连结所跳出来的视窗,ㄚ琪不知这个视窗是否程式也可以控制,很快地Google到【.NET菜鸟自救会】 的[C#]透过 SHDocVw 与 GetForegroundWindow 取得正在使用的 Internet Explorer 网址给ㄚ琪这只C#菜鸟很大的帮助,直接参考这段程式码:

this.lbURL.Items.Clear();

// 取得目前 Shell 的所有视窗
SHDocVw.ShellWindows shellWindows = new SHDocVw.ShellWindowsClass();
foreach (SHDocVw.InternetExplorer ie in shellWindows)
{
    // 判断视窗是否为 iexplore
    if (Path.GetFileNameWithoutExtension(ie.FullName).ToLower().Equals("iexplore"))
    {
        this.lbURL.Items.Add(ie.LocationURL);
    }
}

宾果可以控制这个新弹出的视窗,而且马上可以用程式来关闭,太帅了!

今天终于可以翘起腿来休息看电视了,好久没看疯台湾了,ㄚ琪再细修一下程式应该就可以结案了!