我正在尝试在嵌入式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接口执行类似的操作,但我无法使其中任何一个工作。
如果有经验的人可以提供一个示例代码来说明如何执行此操作(如果上述方法完全可行,当然:),那将会很有帮助。)
答案 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);
}