C# 如何在Windows窗体WebBrowser控件中禁用url检测(IDM_AUTOURLDETECT_模式)?

C# 如何在Windows窗体WebBrowser控件中禁用url检测(IDM_AUTOURLDETECT_模式)?,c#,winforms,internet-explorer,webbrowser-control,ole,C#,Winforms,Internet Explorer,Webbrowser Control,Ole,我试图在嵌入式Windows窗体WebBrowser控件中禁用Internet Explorer的富文本编辑器控件的自动URL检测功能。从IE9开始,这在JavaScript中是可行的,但我的ebedded控件目前必须使用IE7 我发现MSHTML控件中有一个本机命令可以执行以下操作: 是否可以在Forms WebBrowser控件上从C#调用此命令?我发现有两个代码示例使用IOleCommandTarget接口执行类似的操作,但我无法让它们中的任何一个正常工作 如果在这方面有经验的人能够提供一

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

我发现MSHTML控件中有一个本机命令可以执行以下操作:

是否可以在Forms WebBrowser控件上从C#调用此命令?我发现有两个代码示例使用IOleCommandTarget接口执行类似的操作,但我无法让它们中的任何一个正常工作


如果在这方面有经验的人能够提供一个示例代码来说明如何执行此操作(当然,如果上述方法是可行的:)

您需要执行
CGID\u MSHTML
/
IDM\u autourldetate\u MODE
。有关定义和使用示例,请参阅。在您的情况下(未经测试):


我使用Nosertio答案中的代码实现了这一点。这里我提供了更多的细节

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

CKEditor在JavaScript中有一个
instancerady
事件,因此我尝试从该事件处理程序中的JS调用C#,然后执行
IDM_autourldetate_MODE
命令,这样它就正常工作了

因此,似乎必须在页面中的rich editor控件已实例化并准备就绪后执行th
IDM_autourldetate_MODE
命令

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

webBrowser = new WebBrowser
{
    ObjectForScripting = com = new MyScriptCommunicationObject()
};
传递ScriptCommunicationObject是为了能够从JS回调到C#

在CKEditor的
instancerady
事件处理程序中回调:

CKEDITOR.on('instanceReady', function (e) {
    // Call back to C#, that the editor is ready.
    window.external.CKEditorReady();
});
我想类似的事件也可以用于其他富文本编辑器

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

上面的代码需要COM
IOleCommandTarget
接口定义(取自此处:):


我尝试了这个,它运行时没有任何异常,但是它没有禁用自动URL检测。现在我不确定Ole调用是否失败,或者AutoUrlDetect命令是否由于某种原因无法工作。您链接的指南使用另一个Guid作为第一个参数,我也尝试使用该参数调用Exec,但这会抛出一个COMException,并显示以下消息:“尝试撤销尚未注册的删除目标(HRESULT中的异常:0x80040100(DRAGDROP_E_NOTREGISTERED))”
0x80040100
也意味着
OLECMDERR_E_NOTSUPPORTED
。我猜MSHTML文档必须处于设计模式,此命令才能工作:嗯,我尝试使用以下命令将designMode设置为“开”:
this.webBrowser.document.DomDocument.GetType().GetProperty(“designMode”).SetValue(this.webBrowser.document.DomDocument,“开”,null),但使用
“ED016940-BD5B-11CF-BA4E-00C04FD70816”
cmdId仍会引发相同的异常。我还尝试了
“de4ba900-59ca-11cf-9592-444553540000”
id,但是打开designMode会使控件处于只读状态,即使之后我将其设置回“Inherit”或“Off”。我可能会误解一些东西,但我认为这篇文章只说明在JavaScript(使用
document.execCommand)中无法实现这一点()
),但这应该可以通过
IOleCommandTarget::Exec
实现。我找到了多篇指向IOleCommandTarget方法的论坛帖子,但没有一个独立的工作代码示例。
CKEDITOR.on('instanceReady', function (e) {
    // Call back to C#, that the editor is ready.
    window.external.CKEditorReady();
});
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);
}
[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);
}