none
请教用C#自动化IE的程序 RRS feed

  • 问题

  • 我是希望通过C#,启动IE程序,然后再通过C#操控这个IE,例如打开某个url

    我找到的程序是:
                System.Type oType = System.Type.GetTypeFromProgID("InternetExplorer.Application");
                object o = System.Activator.CreateInstance(oType);
                oType.InvokeMember("Visible", System.Reflection.BindingFlags.SetProperty, null, o, new Object[] { true });
                oType.InvokeMember("Navigate", System.Reflection.BindingFlags.InvokeMethod, null, o, new Object[] { "oa.company.com" });
                Thread.Sleep(1000);
                object document = oType.InvokeMember("Document", System.Reflection.BindingFlags.GetProperty, null, o, null);

    现在的问题是,如何得知一个页面已经load完毕了?就是说如何处理onContentReady的事件?
    da jia hao!
    • 已移动 Sheng Jiang 蒋晟 2009年9月30日 12:33 IE开发问题 (发件人:Visual C#)
    2009年9月30日 9:06

答案

  • 您好,我的思路如下:

    1、在这个小应用程序中仅需要打开浏览器并指定网页路径,在路径中带身份验证的用户名和密码的加密字符串。

    2、在web服务器端读取加密字符串自动帮助客户登入然后跳转到邮箱界面。

    个人思路供参考。
    2009年9月30日 7:08
  • 您可以用 SHDOCVW.dll 中的 COM 类,它提供一个 IHTMLDocument 的 ClassInterface,里面有一个页面加载完成的事件。

    用 C# 引用这个 DLL 就会自动创建相应的 Interop 了。


    Mark Zhou
    2009年9月30日 9:48
  • 需要捕获DocumentComplete事件。

    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful.
    Visual C++ MVP
    2009年9月30日 12:34

全部回复

  • 我们是给客户做OA软件的,OA是B/S架构,用户是通过浏览访问,需要输入用户名和密码。
    现在客户提出需要一个客户端的小程序,能够自动下载一些最新的邮件、通知等信息,这个我们使用C#的HttpRequest很快就实现了,但是现在希望能够在客户端小程序里面直接打开一个邮件,而不需要输入用户名和密码,我是这样做的:

                string cookie = GetLoginCookie("http://oa.company.com");//这个函数是自己写的,总之它可以正确反馈SessionID
                System.Type oType = System.Type.GetTypeFromProgID("InternetExplorer.Application");
                object o = System.Activator.CreateInstance(oType);
                oType.InvokeMember("Visible", System.Reflection.BindingFlags.SetProperty, null, o, new Object[] { true });
                oType.InvokeMember("Navigate", System.Reflection.BindingFlags.InvokeMethod, null, o, new Object[] { "oa.company.com" });
                Thread.Sleep(1000);
                object document = oType.InvokeMember("Document", System.Reflection.BindingFlags.GetProperty, null, o, null);
                document.GetType().InvokeMember("cookie", System.Reflection.BindingFlags.SetProperty, null, document, new Object[] { "DomAuthSessId=847D58A730888B6A4D695F24CFC4C549" });


    这样有两个问题:
    1、我必须先Navigate到一个页面,这时候才会有document对象,不能直接对浏览本身设置一个Cookie?
    2、如果用Navigate,那么有没有办法在页面onload的时候执行一个函数或者代码?现在我使用Sleep来等待,这样明显不好。
    3、设置了cookie之后,我还需要手工让浏览器刷新一次才能够正确打开,有没有更好的方法?


    da jia hao!
    2009年9月30日 6:00
  • 您好,我的思路如下:

    1、在这个小应用程序中仅需要打开浏览器并指定网页路径,在路径中带身份验证的用户名和密码的加密字符串。

    2、在web服务器端读取加密字符串自动帮助客户登入然后跳转到邮箱界面。

    个人思路供参考。
    2009年9月30日 7:08
  • 您可以用 SHDOCVW.dll 中的 COM 类,它提供一个 IHTMLDocument 的 ClassInterface,里面有一个页面加载完成的事件。

    用 C# 引用这个 DLL 就会自动创建相应的 Interop 了。


    Mark Zhou
    2009年9月30日 9:48
  • 需要捕获DocumentComplete事件。

    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful.
    Visual C++ MVP
    2009年9月30日 12:34