我在Windows窗体中使用了HtmlEditor控件。
我从这个页面得到了控件:
http://windowsclient.net/articles/htmleditor.aspx
我想通过允许用户从剪贴板粘贴图像来扩展控件功能。现在,您可以粘贴纯文本和格式化文本,但在尝试粘贴图像时,它什么都不做。
基本上我认为当用户在编辑器上按下Ctrl + V时检测到,检查剪贴板上的图像,如果有图像,请将其手动插入编辑器。
这种方法的问题是我无法获取要提升的表单的OnKeyDown或OnKeyPress事件。
我在表单上将KeyPreview属性设置为true,但仍然没有引发事件。
我还试图对表单和编辑器进行子类化(如here所述)来拦截WM_PASTE消息,但它也没有被提出。
关于如何实现这一目标的任何想法?
非常感谢
答案 0 :(得分:5)
我花了一整天时间来解决这个问题并最终找到了解决方案。尝试侦听WM_PASTE消息不起作用,因为基础mshtml控件正在对Ctrl-V进行预处理。您可以侦听OnKeyDown / Up等以捕获Ctrl-V,但这不会阻止底层控件继续其默认的粘贴行为。我的解决方案是阻止Ctrl-V消息的预处理,然后实现我自己的粘贴行为。要从PreProcessing CtrlV消息中停止控制,我必须继承我的Control,即AxWebBrowser,
public class DisabledPasteWebBrowser : AxWebBrowser
{
const int WM_KEYDOWN = 0x100;
const int CTRL_WPARAM = 0x11;
const int VKEY_WPARAM = 0x56;
Message prevMsg;
public override bool PreProcessMessage(ref Message msg)
{
if (prevMsg.Msg == WM_KEYDOWN && prevMsg.WParam == new IntPtr(CTRL_WPARAM) && msg.Msg == WM_KEYDOWN && msg.WParam == new IntPtr(VKEY_WPARAM))
{
// Do not let this Control process Ctrl-V, we'll do it manually.
HtmlEditorControl parentControl = this.Parent as HtmlEditorControl;
if (parentControl != null)
{
parentControl.ExecuteCommandDocument("Paste");
}
return true;
}
prevMsg = msg;
return base.PreProcessMessage(ref msg);
}
}
这是我处理粘贴命令的自定义方法,您可能会使用剪贴板中的图像数据执行类似操作。
internal void ExecuteCommandDocument(string command, bool prompt)
{
try
{
// ensure command is a valid command and then enabled for the selection
if (document.queryCommandSupported(command))
{
if (command == HTML_COMMAND_TEXT_PASTE && Clipboard.ContainsImage())
{
// Save image to user temp dir
String imagePath = Path.GetTempPath() + "\\" + Path.GetRandomFileName() + ".jpg";
Clipboard.GetImage().Save(imagePath, System.Drawing.Imaging.ImageFormat.Jpeg);
// Insert image href in to html with temp path
Uri uri = null;
Uri.TryCreate(imagePath, UriKind.Absolute, out uri);
document.execCommand(HTML_COMMAND_INSERT_IMAGE, false, uri.ToString());
// Update pasted id
Guid elementId = Guid.NewGuid();
GetFirstControl().id = elementId.ToString();
// Fire event that image saved to any interested listeners who might want to save it elsewhere as well
if (OnImageInserted != null)
{
OnImageInserted(this, new ImageInsertEventArgs { HrefUrl = uri.ToString(), TempPath = imagePath, HtmlElementId = elementId.ToString() });
}
}
else
{
// execute the given command
document.execCommand(command, prompt, null);
}
}
}
catch (Exception ex)
{
// Unknown error so inform user
throw new HtmlEditorException("Unknown MSHTML Error.", command, ex);
}
}
希望有人觉得这很有帮助,不要像今天这样浪费一天。