【问题标题】:Is it possible to get the index (start position) for the selected text in a WebBrowser control?是否可以在 WebBrowser 控件中获取所选文本的索引(起始位置)?
【发布时间】:2010-12-22 16:41:47
【问题描述】:

我想获取 WebBrowser 控件中选定文本的索引(起始位置)。类似于进行正则表达式搜索时获得的索引。

我想获取所选文本的“行号和列号”。这些可以根据选择的索引来确定。

我尝试将 IHTMLTxtRange 与 IDisplayServices/IHTMLCaret 结合使用,但我能得到的最好的方法是点位置。

如果“点位置”可以转换为也可以工作的字符位置。

最简单的方法是什么?

【问题讨论】:

  • 另一种方法可能是获取所选内容中 html 元素的结构位置(位置)。
  • 如何定义 HTML 文档中的行号和列号?像一个绝对定位的?
  • 谢谢,我更新了问题以更清楚地说明我在寻找什么。我将“行号和列号”更改为“索引(起始位置)”。

标签: .net winforms webbrowser-control


【解决方案1】:

您可以尝试 MoveMarkupPointerToCaret 和 IMarkupPointer::Left 或 IMarkupPointer2::GetMarkupPosition 来检查插入符号的位置。

【讨论】:

  • 我尝试使用 MoveMarkupPointerToCaret 函数,但未能获得我想要的结果。我想需要花更多的时间在上面。我现在最终做了其他事情(请参阅添加的答案)
【解决方案2】:

作为一个快速修复,我最终使用扩展 WebBrowser 控件的 MouseUp 事件来获取光标位置。我用它来获取 WebBrowser 控件中当前单击/选择文本的元素。

Dim ScreenCoord As New Point(MousePosition.X, MousePosition.Y)
Dim BrowserCoord As Point = webBrowser1.PointToClient(ScreenCoord)
Dim elem As HtmlElement = webbrowser1.Document.GetElementFromPoint(BrowserCoord)

我使用了一个辅助函数来获取光标位置元素的索引。

Function getIndexforElement(elem As htmlElement, browser As webbrowser) As Integer
    Dim page as mshtml.HTMLdocument
    Dim Elements as mshtml.IHTMLElementCollection
    Dim elemCount As Integer = 0
    page = browser.document.Domdocument
    elements = page.getElementsByTagName(elem.TagName)
    For Each element As mshtml.IHTMLElement In elements
        elemCount = elemCount + 1
        If (elem.OffsetRectangle.Top = element.offsetTop) And (elem.OffsetRectangle.Left = element.offsetLeft) Then
            Exit For
        End If
    Next
    If elemCount > 0 Then
        Dim matches as MatchCollection = regex.Matches(browser.DocumentText,"<" & elem.TagName,regexoptions.IgnoreCase Or regexoptions.Multiline)
        Return matches(elemCount-1).Index + 1
    Else
        Return 0
    End If  
End Function

有了元素的索引,可以使用一个简单的正则表达式来查找原始 html 文件中的行号。

Function getLineNumber(textIn As String, index As Integer) As Integer
    textIn = textIn.Replace(VbCrLf,VbLf)
    Dim line as Integer = regex.Matches(textIn.Substring(0,index),"\n",RegexOptions.Multiline).Count + 1                                                                                 
    If line < 1 Then line = 1
    Return line
End Function

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-15
    • 2011-09-30
    • 2019-07-17
    • 1970-01-01
    相关资源
    最近更新 更多