WebBrowser - 检查execCommand的结果

时间:2010-11-15 17:22:26

标签: c# .net mshtml

我使用WebBrowser:

IHTMLDocument2 doc = (IHTMLDocument2)webBrowser.Document;
IHTMLTxtRange range = (IHTMLTxtRange)doc.selection.createRange();
...
if(range.execCommand("StrikeThrough", false, null))
{
    //Is range strikethroughed or not?
}

我如何检测选择是否通过(在代码中)?

3 个答案:

答案 0 :(得分:0)

前一段时间我用c ++编写了一个基于mshtml的编辑器,我做了类似下面的代码来获取当前选择的文本样式。

CComQIPtr<IOleCommandTarget> spCmdTarg(pDispDoc);

if (pStyle && spCmdTarg)
{
    const ULONG uNumCmnds = 4;
    OLECMD arrCmnds[uNumCmnds];
    arrCmnds[0].cmdID = IDM_BOLD;
    arrCmnds[1].cmdID = IDM_ITALIC;
    arrCmnds[2].cmdID = IDM_UNDERLINE;
    arrCmnds[3].cmdID = IDM_STRIKETHROUGH;

    if ( SUCCEEDED(spCmdTarg->QueryStatus(&CGID_MSHTML, uNumCmnds, arrCmnds, NULL)) )
    {
        pStyle->SetBold(arrCmnds[0].cmdf & Shdocvw_tlb::OLECMDF_LATCHED);
        pStyle->SetItalic(arrCmnds[1].cmdf & Shdocvw_tlb::OLECMDF_LATCHED);
        pStyle->SetUnderline(arrCmnds[2].cmdf & Shdocvw_tlb::OLECMDF_LATCHED);
        pStyle->SetStrikeThrough(arrCmnds[3].cmdf & Shdocvw_tlb::OLECMDF_LATCHED);
    }
}

我不太确定如何在c#中翻译这段代码以及mshtml的interlop层有什么可用,但希望这可以帮助你在某个地方开始。

答案 1 :(得分:0)

如果命令成功,execCommand将返回true。所以你可以试试:

if (range.execCommand("StrikeThrough", false, null))
{
    // Strikethrough succeeded
}

要确定选择是否已经是StrikeThrough,您可以查看文本范围对象的parentElement属性,看看它是否是一个strike元素。

答案 2 :(得分:0)

我知道已经有3年了,但我认为对任何人来说都是:

尝试使用

bool struckthrough = doc.queryCommandState("StrikeThrough");

如果当前选择具有该标记,则返回true / false。您正在创建范围对象 - 您可以range.select()将其设置为要由查询状态检查的范围。