如何在Windows窗体WebBrowser控件中禁用URL检测(IDM_AUTOURLDETECT_MODE)?

时间:2014-04-23 15:23:05

标签: c# winforms internet-explorer webbrowser-control ole

我正在尝试在嵌入式Windows窗体WebBrowser控件中禁用Internet Explorer的富文本编辑器控件的自动URL检测功能。从IE9开始,这在JavaScript中是可行的,但我的ebedded控件目前必须使用IE7。

我发现MSHTML控件中有一个本机命令执行此操作:http://msdn.microsoft.com/en-us/library/aa769893%28VS.85%29.aspx

是否有可能以某种方式在Forms WebBrowser控件上从C#调用此命令?我发现有几个代码示例使用IOleCommandTarget接口执行类似的操作,但我无法使其中任何一个工作。

如果有经验的人可以提供一个示例代码来说明如何执行此操作(如果上述方法完全可行,当然:),那将会很有帮助。)

2 个答案:

答案 0 :(得分:1)

您需要执行CGID_MSHTML / IDM_AUTOURLDETECT_MODE。有关定义和样本使用IOleCommandTarget,请参阅"HOW TO: Invoke the Find, View Source, and Options Dialog Boxes for the WebBrowser Control from Visual C# .NET"。在你的情况下(未经测试):

var CGID_MSHTML = new Guid("de4ba900-59ca-11cf-9592-444553540000");
var IDM_AUTOURLDETECT_MODE = (uint)2400;
var commandTarget = (IOleCommandTarget)webBrowser.Document.DomDocument;
var arg1 = (object)false;
var arg2 = new Object();
commandTarget.Exec(
    ref CGID_MSHTML, IDM_AUTOURLDETECT_MODE, 0, ref arg1, ref arg2);

答案 1 :(得分:1)

我设法使用Noseratio答案中的代码来实现这一点。在这里,我提供了更多细节。

我在Windows窗体WebBrowser控件中的WPF应用程序中使用CKEditor富文本编辑器。首先,我尝试在IDM_AUTOURLDETECT_MODE事件的处理程序中执行DocumentCompleted命令,但它不起作用。

CKEditor在JavaScript中有一个instanceReady事件,所以我试图从该事件处理程序中的JS回调到C#并执行IDM_AUTOURLDETECT_MODE命令,这样它就能正常工作。

因此,在页面中的丰富编辑器控件已经实例化并准备就绪后,似乎必须执行th IDM_AUTOURLDETECT_MODE命令。

以下是相关的代码段 创建WebBrowser控件:

webBrowser = new WebBrowser
{
    ObjectForScripting = com = new MyScriptCommunicationObject()
};

传递ScriptCommunicationObject是为了能够从JS回调到C#。

回调CKEditor的instanceReady事件处理程序:

CKEDITOR.on('instanceReady', function (e) {
    // Call back to C#, that the editor is ready.
    window.external.CKEditorReady();
});

我想类似的事件也可以与其他富文本编辑器一起使用。

C#中的事件处理程序,它运行命令(©Noseratio :)):

public void CKEditorReady()
{
    var CGID_MSHTML = new Guid("de4ba900-59ca-11cf-9592-444553540000");
    var IDM_AUTOURLDETECT_MODE = (uint)2400;
    var commandTarget = (IOleCommandTarget)webBrowser.Document.DomDocument;
    var arg1 = (object)false;
    var arg2 = new Object();
    commandTarget.Exec(ref CGID_MSHTML, IDM_AUTOURLDETECT_MODE, 0, ref arg1, ref arg2);
}

以上代码需要COM IOleCommandTarget接口定义(取自此处:http://support.microsoft.com/kb/329014):

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct OLECMDTEXT
{
    public uint cmdtextf;
    public uint cwActual;
    public uint cwBuf;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)]
    public char rgwz;
}

[StructLayout(LayoutKind.Sequential)]
public struct OLECMD
{
    public uint cmdID;
    public uint cmdf;
}

// Interop definition for IOleCommandTarget. 
[ComImport,
Guid("b722bccb-4e68-101b-a2bc-00aa00404770"),
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IOleCommandTarget
{
    void QueryStatus(ref Guid pguidCmdGroup, UInt32 cCmds, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] OLECMD[] prgCmds, ref OLECMDTEXT CmdText);
    void Exec(ref Guid pguidCmdGroup, uint nCmdId, uint nCmdExecOpt, ref object pvaIn, ref object pvaOut);
}