RichTextBox是一个支持RTF的文本框,但很多情况下我们并不希望用户采用快捷键(如CTRL+V)来粘贴有格式的内容,或者我们需要清除用户粘贴的内容的格式,怎么办呢? 其实非常简单: 去掉格式:把剪切板的字符串取出来放到一个变量中(这个过程就去掉格式了),再将变量中的值设回剪贴板,然后粘贴就ok了
private void tbClob_KeyDown(object sender, KeyEventArgs e) { if (e.Control && e.KeyCode == Keys.V) { IDataObject dataObj = Clipboard.GetDataObject(); if (dataObj.GetDataPresent(DataFormats.StringFormat)) { e.Handled = true; //去掉格式文本的格式 var txt = (string) Clipboard.GetData(DataFormats.StringFormat); Clipboard.Clear(); Clipboard.SetData(DataFormats.StringFormat, txt); tbClob.Paste(); } } } private void tbTemplate_KeyDown(object sender, KeyEventArgs e) { //防止ctrl+v粘贴有格式的文本进来 if (e.Control && e.KeyCode == Keys.V) { e.Handled = true; //这句是关键,不然你会发现粘贴了两次 v.miPaste.PerformClick(); } } private void miPaste_Click(object sender, EventArgs e) { v.tbTemplate.Paste(DataFormats.GetFormat(TextDataFormat.UnicodeText.ToString())); }
网上有很多种方式(纯粹是扩展阅读,可以不看),例如自己扩展一个RichTextBox,在其中拦截WM_PASTE消息,如下:
namespace WindowsApplication2 { internal class RichTextPaste : RichTextBox { protected override void WndProc(ref Message m) { base.WndProc(ref m); switch (m.Msg) { case 257: if ((int) m.LParam == -1071841279 && (int) m.WParam == 17) { MessageBox.Show("Fired"); } break; } } } }
有用,比较复杂,还有消息判断简单的,如:
protected override void WndProc(ref System.Windows.Forms.Message m) { if(m.Msg== WM_PASTE)//0x302:WM_PASTE 还有一种处理手法,就是注册本应用只接收文本类的粘贴,采用:RegisterClipboardFormat,也可以 { } }
采用:RegisterClipboardFormat,也可以