2015-04-01 51 views
0

我們有一個UserControls,它從RichTextBox開始。我們希望禁止用戶在此用戶控件中輸入任何圖像(帶有複製粘貼)。在WinForms的RichTextBox中禁用圖像粘貼

我發現了幾個地方,說到這個:

目前,我有這個解決方案:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 
{ 
    if (keyData == (Keys)Shortcut.CtrlV || keyData == (Keys)Shortcut.ShiftIns) 
    { 
     if (Clipboard.ContainsImage()) 
     { 
      return false; 
     } 
    } 
    return base.ProcessCmdKey(ref msg, keyData); 
} 

這與複製粘貼工作CTRL + C-CTRL + V,但不包括上下文菜單。

編輯

我試着給定的命題:

public class CustomRichBox : RichTextBox 
{ 
    private const int WM_PASTE = 0x0302; 
    protected override void WndProc(ref Message m) 
    { 
     if (m.Msg == WM_PASTE) 
     { 
      if (Clipboard.ContainsImage()) 
      { 
       return; 
      } 
     } 
     base.WndProc(ref m); 
    } 
} 

但是,當我做CTRL + V,我沒有收到這個消息

+0

不是一個正確的答案,但這裏有一些關於如何使用非託管MFC豐富的編輯控件做到這一點的建議:https://stackoverflow.com/questions/2250759/how-does-a-cricheditctrl-know-a-paste -operation-has-been-performed和http://stackoverflow.com/questions/2104809/en-protected-and-richedit。也許你可以嘗試利用這個不知何故? – dbc 2015-04-02 18:47:22

回答

0

你可以嘗試覆蓋WndProc方法來過濾WM_PASTE消息:

protected override void WndProc(ref Message m) 
{ 
    // Trap WM_PASTE with image: 
    if (m.Msg == 0x302 && Clipboard.ContainsImage()) 
    { 
     return; 
    } 
    base.WndProc(ref m); 
} 

編輯
不幸的是,這種做法是行不通的,因爲RichTextBox控制不發送WM_PAINT消息本身。另見:Detecting if paste event occurred inside a rich text box

+0

那麼,關於你給的鏈接:第一種解決方案不適用於上下文菜單。基於長度的東西感覺很髒。我的意思是我們有一些模型綁定在這些文本上,所以如果模型改變它的值並將其反映在RichTextBox上,它將被檢測爲粘貼 – J4N 2015-04-01 14:20:40

0

不幸的是,沒有全局的粘貼事件,你可以像在WPF中一樣訂閱。但也許這是一個解決方案爲您提供:

hook on default "Paste" event of WinForms TextBox control

這爲我工作。

+0

這應該捕獲Ctrl + V和上下文菜單 - >粘貼?還是隻有第二個? – J4N 2015-04-01 14:21:39

+0

這應該適用於兩者。我試過成功。 – 2015-04-02 08:43:22

+0

這很奇怪,我複製粘貼他們的代碼(請參閱我的編輯),但是當我按Ctrl + V時,它不起作用。 – J4N 2015-04-02 10:51:03