2011-10-21 6 views
10

特定のテキストボックスにペースト機能をオーバーライドする必要があります。テキストはそのテキストボックスに貼り付けると、私はそれが次のことを実行したい:テキストボックスへのペーストのオーバーライド

AddressTextBox.Text = Clipboard.GetText().Replace(Environment.NewLine, " "); 

(複数行から単一に変更)

私はこれをどのように行うことができますか?テキストボックスコントロールにメッセージを傍受する

+2

チェックこの1:http://stackoverflow.com/questions/3446233/hook-on-default-paste-event-of-winforms-textbox-control –

答えて

27

を提案し、あなたはネイティブTextBoxコントロールが取得する低レベルのWindowsのメッセージを傍受することができますクリップボードからペーストするよう指示します。メッセージWM_PASTE。キーボードでCtrl + Vキーを押すか、コンテキストメニューの[貼り付け]コマンドを使用すると、両方で生成されます。コントロールのWndProc()メソッドをオーバーライドして、それをキャッチし、必要に応じてペーストを実行し、ではなく、をベースクラスに渡します。

プロジェクトに新しいクラスを追加し、下に示すコードをコピー/貼り付けします。コンパイル。新しいコントロールをツールボックスの上部からフォームにドロップし、既存のコントロールを置き換えます。

using System; 
using System.Windows.Forms; 

class MyTextBox : TextBox { 
    protected override void WndProc(ref Message m) { 
     // Trap WM_PASTE: 
     if (m.Msg == 0x302 && Clipboard.ContainsText()) { 
      this.SelectedText = Clipboard.GetText().Replace('\n', ' '); 
      return; 
     } 
     base.WndProc(ref m); 
    } 
} 
+0

これをProgram.csまたはForm1.csに挿入しますか?そして私はそれをいくつかの方法と呼ぶ必要がありますか?それは働いていないので – cb1295

+2

あなたは別のクラスに入れます。コンパイル。新しいコントロールをツールボックスの上部からフォームにドロップします。 –

+1

このコードは仕事をしたので、あなたは答えを得ます。ありがとう!!! – cb1295

5

、TexBoxからクラスを派生し、

class MyTB : System.Windows.Forms.TextBox 
{ 

    protected override void WndProc(ref Message m) 
    { 
     switch (m.Msg) 
     { 

      case 0x302: //WM_PASTE 
       { 
        AddressTextBox.Text = Clipboard.GetText().Replace(Environment.NewLine, " "); 
        break; 
       } 

     } 

     base.WndProc(ref m); 
    } 

} 

を実装が可能だhere

+0

私は私のForm1.cs Iでこれを置く場合次のエラーが表示されます。エラー外部型の非静的メンバにネストされた型でアクセスできません。Program.csに挿入すると、現在のコンテキストにAddressTextBoxが存在しないことが示されます。 – cb1295

+2

新しいクラスをプロジェクト - >新規アイテムの追加 - クラス名 'MyTb'で追加します。プロジェクトをビルドすると、MyTBがツールボックスに表示されます。フォームに配置することができます。 –

+0

詳細な説明をお寄せいただきありがとうございます。しかし、あなたのコードはトリックをやっていないか、正しく使用しませんでした。とにかく、ありがとう! – cb1295

関連する問題