
Form+HTML 界面.doc
11页窗口与WebBrowser控件相结合开发程序界面by skyfrog 2011/5/8 补C# Windows应用程序与JavaScript交互使用Winform WebBrowser控件对访问页面执行、改写、添加Javascript代码,可以解决许多问题,实现你想要的效果1. 在Form上添加Webbrowser控件,然后再Form类上添加COM可访问属性://设置如下属性让COM可访问(网页文件需要)[System.Runtime.InteropServices.ComVisibleAttribute(true)]2. 初始化WebBrowser的Url与ObjectForScripting两个属性private void InitializeWebBrowser() { //设置URL string path = Application.StartupPath + "\\TOC.html"; if (File.Exists(path)) { webBrowser1.Url = new Uri(path); m_Ready = true; } else webBrowser1.Url = new Uri("about:blank"); //如果TOC文件不存在 //设置脚本调用对象 webBrowser1.ObjectForScripting = this; } Url属性:WebBrowser控件显示的网页路径ObjectForScripting属性:该对象可由显示在WebBrowser控件中的网页所包含的脚本代码访问。
3. 在C#中调用Javascript方法通过WebBrowser类的Document属性中的InvokeScript方法调用当前网页的Javascript方法代码示例如下:webBrowser1.Document.InvokeScript("AppendLayer", new object[1] { layerNameStr });其中,"AppendLayer"是网页中的javascript方法名称,object数组是其参数4. 在Javascript中调用C#方法JavaScript通过window.external调用C#公开的方法即由ObjectForScripting属性设置的类的实例中所包含的公共方法代码示例如下:window.external.RemoveLayer(index);实现Form与页面的交互 HtmlDocument htmlDoc = webBrowser1.Document;//得到webBrowser1控件中页面的所有文档 HtmlElement btnElement = htmlDoc.All["btnClose"];//在文档中找到需要和form交互的元素 if (btnElement != null) { btnElement.Click += new HtmlElementEventHandler(HtmlBtnClose_Click);//给这个元素Click事件(元素为Button)加上EventHandler(委托方法名) } WebBrowser控件说明使用 WebBrowser 控件还可以显示在应用程序中创建的内容或从数据库或资源文件检索的内容。
使用 DocumentText 或 DocumentStream 属性,以字符串或数据流的形式获取或设置当前文档的内容 还可以通过 Document 属性操作网页的内容,该属性包含一个 HtmlDocument 对象,向当前页提供对 HTML 文档对象模型 (DOM) 的托管访问 该属性与 ObjectForScripting 属性组合使用时,对在应用程序代码与网页中的动态 HTML (DHTML) 代码之间实现双向通信十分有用,使用它可以在单个用户界面中组合基于 Web 的控件和 Windows 窗体控件 在应用程序中可以使用 Document 属性调用脚本代码方法 脚本代码可以通过 window.external 对象访问应用程序,该对象是用于主机访问的内置 DOM 对象,它映射到为 ObjectForScripting 属性指定的对象 The WebBrowser control is a managed wrapper for the ActiveX WebBrowser control, and uses whichever version of the control is installed on the user's computer. 注意:WebBrowser 控件会占用大量资源。
使用完该控件后一定要调用 Dispose 方法,以便确保及时释放所有资源必须在附加事件的同一线程上调用 Dispose 方法,该线程应始终是消息或用户界面 (UI) 线程注意:WebBrowser 类只能在设置为单线程单元 (STA) 模式的线程中使用 若要使用此类,请确保您的 Main 方法已用 STAThreadAttribute 特性标记它WebBrowser控件使用详解方法说明 GoBack 相当于IE的“后退”按钮,使你在当前历史列表中后退一项 GoForward 相当于IE的“前进”按钮,使你在当前历史列表中前进一项 GoHome 相当于IE的“主页”按钮,连接用户默认的主页 GoSearch 相当于IE的“搜索”按钮,连接用户默认的搜索页面 Navigate 连接到指定的URL Refresh 刷新当前页面 Refresh2 同上,只是可以指定刷新级别,所指定的刷新级别的值来自RefreshConstants枚举表, 该表定义在ExDisp.h中,可以指定的不同值如下: REFRESH_NORMAL 执行简单的刷新,不将HTTP pragma: no-cache头发送给服务器 REFRESH_IFEXPIRED 只有在网页过期后才进行简单的刷新 REFRESH_CONTINUE 仅作内部使用。
在MSDN里写着DO NOT USE! 请勿使用 REFRESH_COMPLETELY 将包含pragma: no-cache头的请求发送到服务器 Stop 相当于IE的“停止”按钮,停止当前页面及其内容的载入 属性说明 Application 如果该对象有效,则返回掌管WebBrowser控件的应用程序实现的自动化对象(IDispatch)如果在宿主对象中自动化对象无效,这个程序将返回WebBrowser 控件的自动化对象 Parent 返回WebBrowser控件的父自动化对象,通常是一个容器,例如是宿主或IE窗口 Container 返回WebBrowser控件容器的自动化对象通常该值与Parent属性返回的值相同 Document 为活动的文档返回自动化对象如果HTML当前正被显示在WebBrowser中,则 Document属性提供对DHTML Object Model的访问途径 TopLevelContainer 返回一个Boolean值,表明IE是否是WebBrowser控件顶层容器,是就返回true Type 返回已被WebBrowser控件加载的对象的类型。
例如:如果加载.doc文件,就会返 回Microsoft Word Document Left 返回或设置WebBrowser控件窗口的内部左边与容器窗口左边的距离 Top 返回或设置WebBrowser控件窗口的内部左边与容器窗口顶边的距离 Width 返回或设置WebBrowser窗口的宽度,以像素为单位 Height 返回或设置WebBrowser窗口的高度,以像素为单位 LocationName 返回一个字符串,该字符串包含着WebBrowser当前显示的资源的名称,如果资源 是网页就是网页的标题;如果是文件或文件夹,就是文件或文件夹的名称 LocationURL 返回WebBrowser当前正在显示的资源的URL Busy 返回一个Boolean值,说明WebBrowser当前是否正在加载URL,如果返回true 就可以使用stop方法来撤销正在执行的访问操作 WebBrowser 的事件 Private Events Description BeforeNavigate2 导航发生前激发,刷新时不激发CommandStateChange 当命令的激活状态改变时激发。
它表明何时激活或关闭Back和Forward 菜单项或按钮 DocumentComplete 当整个文档完成是激发,刷新页面不激发DownloadBegin 当某项下载操作已经开始后激发,刷新也可激发此事件DownloadComplete 当某项下载操作已经完成后激发,刷新也可激发此事件NavigateComplete2 导航完成后激发,刷新时不激发NewWindow2 在创建新窗口以前激发OnFullScreen 当FullScreen属性改变时激发该事件采用VARIENT_BOOL的一个输 入参数来指示IE是全屏显示方式(VARIENT_TRUE)还是普通显示方式(VARIENT_FALSE) OnMenuBar 改变MenuBar的属性时激发,标示参数是VARIENT_BOOL类型的 VARIANT_TRUE是可见,VARIANT_ FALSE是隐藏 OnQuit 无论是用户关闭浏览器还是开发者调用Quit方法,当IE退出时就会激发 OnStatusBar 与OnMenuBar调用方法相同,标示状态栏是否可见 OnToolBar 调用方法同上,标示工具栏是否可见OnVisible 控制窗口的可见或隐藏,也使用一个VARIENT_BOOL类型的参数 StatusTextChange 如果要改变状态栏中的文字,这个事件就会被激发,但它并不理会程序是否有状态栏TitleChange Title有效或改变时激发总结:在WebBrowser页面上,可以采用两种方式与Form对象交互,一种是采用windows.external对象来调用Form类的公共成员函数,另一种方式是采用事件响应的方式。
ref: C#WinForm开发系列http://www.our- Case 1:用WinForm的Event Handler响应Web页面的事件 现在有这样一个Windows Application,它的界面上只有一个WebBrows。
