标签: mshtml

将事件处理程序附加到mshtml.DispHTMLInputElement

我正忙于在C#中编写BHO(浏览器助手对象),我需要将事件处理程序附加到输入元素上的所有onclick事件.我没有使用visual studio提供的内置web浏览器,而是启动了客户端PC上安装的Internet Explorer的新实例.使用不同版本的IE时会出现问题.

在IE7和IE8中,我可以这样做:

public void attachEventHandler(HTMLDocument doc)
{
  IHTMLElementCollection els = doc.all;
  foreach (IHTMLElement el in els)
  {
    if(el.tagName == "INPUT")
    {
      HTMLInputElementClass inputElement = el as HTMLInputElementClass;
      if (inputElement.IHTMLInputElement_type != "text" && InputElement.IHTMLInputElement_type != "password")
      {
        inputElement.HTMLButtonElementEvents_Event_onclick += new HTMLButtonElementEvents_onclickEventHandler(buttonElement_HTMLButtonElementEvents_Event_onclick);
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

这很有效,事实是,IE6在转换为HTMLInputElementClass时会抛出一个错误,所以你被迫转换为DispHTMLInputElement:

public void attachEventHandler(HTMLDocument doc)
{
  IHTMLElementCollection els = doc.all;
  foreach (IHTMLElement el in els)
  {
    if(el.tagName == "INPUT")
    {
      DispHTMLInputElement inputElement = el as DispHTMLInputElement;
      if (inputElement.type != "text" && inputElement.type != "password") …
Run Code Online (Sandbox Code Playgroud)

c# bho mshtml event-handling

3
推荐指数
1
解决办法
5255
查看次数

从IHTMLDocument2*获取页面上的可见文本

我试图获取Internet Explorer Web浏览器窗口的文本内容.

我遵循以下步骤:

  1. 获取指向IHTMLDocument2的指针
  2. 从IHTMLDocument2我获取身体作为IHTMLElement
    3.在身体上我调用get_innerText

编辑


  1. 我获得了身体的所有孩子,并尝试对所有IHTMLElements进行递归调用
  2. 如果我得到任何不可见的元素或者如果我得到一个标签是脚本的元素,我会忽略该元素及其所有子元素.

我的问题是

  1. 除了在页面上可见的文本,我还获得了具有哪种 style ="display:none"的内容
  2. 对于google.com,我还会获得javascript以及文本.

我尝试了一种递归方法,但我对如何处理这样的场景毫无头绪,

<div>
Hello World 1
<div style="display: none">Hello world 2</div>
</div>
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我将无法获得"Hello World 1"

任何人都可以帮助我找到从IHTMLDocument2*获取文本的最佳方法.我使用的是C++ Win32,没有MFC,ATL.

谢谢,Ashish.

c++ winapi ole mshtml html-parsing

3
推荐指数
1
解决办法
1943
查看次数

提交表单并从网站VBA获取数据

我正在尝试使用Excel中的VBA 从此站点获取数据.我试图做的和有用的是使用像这样的InternetExplorer对象:

Set IE = CreateObject("InternetExplorer.Application")
IE.Visible = False
IE.Navigate "http://zertifikate.finanztreff.de"
IE.document.getElementById("USFsecuritySearchDropDown").Value = "DE000BP5TBQ2"
IE.document.getElementById("USFsecuritySearchDropDownForm").submit

Do While IE.Busy Or IE.readyState <> 4  'wait until page is loaded
    Application.Wait DateAdd("s", 1, Now)
Loop
MsgBox IE.document.getElementById("BP5TBQ~30~5").innerHTML
Run Code Online (Sandbox Code Playgroud)

然而,这工作非常缓慢,并没有得到总是正确的结果.我怀疑有时它不会等到网页加载.我试图寻找答案,我在stackoverflow上找到了这个答案.现在我想弄清楚如何使用MSXML2和MSHTML重写我的宏.到目前为止,我能够做到这一点:

Dim IE As MSXML2.XMLHTTP60
Set IE = New MSXML2.XMLHTTP60

IE.Open "GET", "http://zertifikate.finanztreff.de", False
IE.send
While IE.ReadyState <> 4
    DoEvents
Wend

Dim HTMLDoc As MSHTML.HTMLDocument
Dim htmlBody As MSHTML.htmlBody

Set HTMLDoc = New MSHTML.HTMLDocument
Set htmlBody = HTMLDoc.body
htmlBody.innerHTML = …
Run Code Online (Sandbox Code Playgroud)

excel vba msxml mshtml

3
推荐指数
1
解决办法
1万
查看次数

如何使用mshtml将复选框设置为"已选中"?

我可以使用mshtml完成我需要做的大部分工作,但是我对如何将复选框输入元素设置为"已检查"感到困惑.这是情况......

IHTMLElementCollection inputElements = (IHTMLElementCollection)doc.all.tags("input");
foreach (IHTMLElement el in inputElements)
{
    string elementHtml = el.outerHTML;
    string termsOfServiceIdentifier = "id=chkUTOS_ver2";

    //  select the Terms of Service checkbox
    if (elementHtml.Contains(termsOfServiceIdentifier)) 
    {
        HTMLInputElement chkTOS = (HTMLInputElement)el;
        chkTOS.@checked = true;  //  that's the solution. Thanks Wayne.
     }
     else
     {
        //  do nothing - we're not interested in this element
     }
}
Run Code Online (Sandbox Code Playgroud)

在此先感谢您的帮助!

格雷格

.net html c# webforms mshtml

2
推荐指数
1
解决办法
2911
查看次数

C#中的mshtml.HTMLDocumentClass

在C#中,我设法从InternetExplorer对象获取整个HTMLDocumentClass(导航到某个URL).

但是,在Visual Studio 2008的调试模式下,此特定URL的HTMLDocumentClass的内容是MASSIVE,包括activeElement,alinkColor,all,applets,charset,childNodes等属性等.

该页面中有一个按钮,我希望将其更改为"Clicked".但我不知道如何找到该按钮的名称/ ID /标签.有一个简单的教程,使用如下语句:

HTMLInputElement button =
  (HTMLInputElement)theDoc.getElementById("Button1");
button.click();
Run Code Online (Sandbox Code Playgroud)

但我的网址结构比这复杂100倍.

假设网址是yahoo.com,我想"点击"网络搜索按钮.

有任何系统的方式来解决这个问题?

html c# dom mshtml

2
推荐指数
1
解决办法
3万
查看次数

如何使TWebBrowser忽略其他控件的加速器字符?

我有一个TWebBrowser放在一个启用了designMode的表单上.
浏览器Bellow我有一个关闭按钮,标题设置为'Clos&e'.
当我在WebBrowser中编辑文档的内容时,按下键E,调用按钮关闭.
它似乎正在处理TWebBrowser,就像其他不处理键和/或不接受字符的控件一样(例如TButton).

我怎么解决这个问题?

提前致谢.

browser delphi mshtml twebbrowser

2
推荐指数
1
解决办法
1198
查看次数

是否有另一种方法可以在不使用Application.ProcessMessages的情况下加载MSHTML文档?

是否有另一种方法可以在不使用Application.ProcessMessages的情况下加载MSHTML文档?

要将文档加载到IHTMLDocument中,我需要这样做:

while Doc.readyState <> 'complete' do 
   Application.ProcessMessages;
Run Code Online (Sandbox Code Playgroud)

我希望在加载过程中不处理所有的消息队列,因为我将改变我的应用程序流,换句话说,在完成加载之后应该处理的一些消息可以更早地处理,甚至在加载结束之前.

IHTMLDocument期望在加载过程中有一个特殊的消息代码?还是有另一种加载方式?

delphi mshtml

2
推荐指数
1
解决办法
1178
查看次数

如何从IHTMLDocument2获取所有mshtml.IHTMLDivElement?

如何从IHTMLDocument2获取所有mshtml.IHTMLDivElement?

  private mshtml.IHTMLDocument2 doc = (IHTMLDocument2)WPFBrowser.Document;

  ???

  List<mshtml.IHTMLDivElement> allDivs = ???
Run Code Online (Sandbox Code Playgroud)

.net html c# dom mshtml

2
推荐指数
1
解决办法
1万
查看次数

如何在TWebbrowser中获取JS脚本控制台输出?

我想在TWebbrowser中运行一个javascript代码并获取它的控制台输出.例如,如果我在控制台中运行此代码:

var a = 2; var b = 3; var c = a +b ; console.log('The result is '+ c); 
Run Code Online (Sandbox Code Playgroud)

我在控制台上得到这个输出:

The result is 5
Run Code Online (Sandbox Code Playgroud)

我用来运行带有TWebbrowser的JS脚本的代码是这样的:

twebbrowser1.navigate('javascript:var a = 2; var b = 3; var c = a +b ; console.log('The result is '+ c);');
Run Code Online (Sandbox Code Playgroud)

它工作,但我不知道如何获得控制台输出.有办法吗?

提前致谢 !

delphi mshtml twebbrowser

2
推荐指数
1
解决办法
1108
查看次数

MSHTML HTMLHeadElementClass COM错误

我目前正在使用MS HTML将JavaScript代码插入到网站中.

我引用了Microsoft HTML Object Library并输入了这段代码.

IHTMLDocument2 doc = BrowserHost.Document as HTMLDocumentClass;
IHTMLElement head = (IHTMLElement)
      ((IHTMLElementCollection)doc.all.tags("head")).item(null, 0);
IHTMLScriptElement scriptObject = 
      (IHTMLScriptElement)doc.createElement("script");
scriptObject.type = @"text/javascript";
scriptObject.text = TTS.TTSWebFactory.GetJavascript();
((HTMLHeadElementClass)head).appendChild((IHTMLDOMNode)scriptObject);
Run Code Online (Sandbox Code Playgroud)

我在脚本的最后一行收到错误,这是消息.

Unable to cast COM object of type 'System._ComObject' to class type 
'mshtml.HTMLHeadElementClass'. COM components that enter the CLR and do not 
support IProvideClassInfo or that do not havae any iterop assembly registered 
will be wrapped in the _ComObject type. Instances of this type cannot be cast 
to any other class; …
Run Code Online (Sandbox Code Playgroud)

c# com mshtml comobject

1
推荐指数
1
解决办法
4272
查看次数

如何打开Internet Explorer窗口,在URL上导航并使用c#和mshtml库获取她的文档(HTMLDocument或InternetExplorer)

如何打开Internet Explorer窗口或选项卡,导航它并使用c#和mshtml库获取她的文档(HTMLDocument或InternetExplorer).IE对象的类型应该是HTMLDocument或InternetExplorer.

c# internet-explorer mshtml

1
推荐指数
1
解决办法
4748
查看次数

MSHTML:调用javascript对象的成员?

使用.NET WebBrowser控件,执行HtmlElement的成员非常简单.

假设有一个名为"player"的JavaScript对象,其成员名为"getLastSongPlayed"; 从.NET WebBrowser控件调用它将是这样的:

HtmlElement elem = webBrowser1.Document.getElementById("player");
elem.InvokeMember("getLastSongPlayed");
Run Code Online (Sandbox Code Playgroud)

现在我的问题是:如何使用mshtml实现这一目标?

在此先感谢,阿尔丁

编辑:

我把它运行起来,看下面的答案!

javascript c# browser mshtml

0
推荐指数
1
解决办法
5179
查看次数