2012-01-23 10 views
1

Iは、様々な文字の長さ3つのテキストボックス、それぞれを有しているとパネルを有する検索画面を含む.NETアプリケーションを有しています。ペーストは、

は、最初のボックスからを呼び出され、3つのボックスに私のクリップボードに貼り付けると、私は何をしたいのですがキャプチャときペーストコマンドです。

この機能は、シリアルキーや電話番号の入力を受け付け、多くの近代的なアプリケーションと同様です。

+0

の可能性のある重複http://stackoverflow.com/questions/1156975/copy-paste-event-に配置することができますlistener-in-c-sharp – ean5533

+0

貼り付けコマンドが呼び出されたときにキャプチャしますか?コピーコマンドでキャプチャしませんか? – Liron

答えて

4

は、私の知る限りが見つけることができるようWM_PASTEイベントをキャプチャするよりも、これを行うのは他の賢明な方法はありません。

がTexBoxからクラスを派生し、このメソッドを実装します。

using System.Windows.Forms; 
using System.ComponentModel; 

class TextBoxWithOnPaste : TextBox 
{ 

    public delegate void PastedEventHandler(); 

    [Category("Action")] 
    [Description("Fires when text from the clipboard is pasted.")] 
    public event PastedEventHandler OnPaste; 

    protected override void WndProc(ref Message m) 
    { 
     if (m.Msg == 0x302 && OnPaste != null) // process WM_PASTE only if the event has been subscribed to 
     { 
      OnPaste(); 
     } 
     else 
     { 
      base.WndProc(ref m); 
     } 
    } 
} 

その後、私はこのケースでは、フォーム上のこれらのカスタムコントロールの3を入れて、同じ方法にすべての3つのテキストボックスにOnPasteイベントを割り当てますtextPasted()それを呼ばれる:

private void textPasted() 
{ 
    String input = Clipboard.GetText(); 

    int l1 = textBoxWithOnPaste1.MaxLength; 
    int l2 = textBoxWithOnPaste2.MaxLength; 
    int l3 = textBoxWithOnPaste3.MaxLength; 

    try 
    { 
     textBoxWithOnPaste1.Text = input.Substring(0, l1); 
     textBoxWithOnPaste2.Text = input.Substring(l1, l2); 
     textBoxWithOnPaste3.Text = input.Substring(l2, l3); 
    } 
    catch (Exception) 
    { } 

} 

あなたは「シリアルのような」暗示するので、私はあなたが貼り付けられた文字列がテキストボックス間で分割することにしたい推測しました。上記のコードでは、テキストがイベントのパラメータを変更することにより、例えば、貼り付けたテキストボックスている知っていたならば、それはいいだろうので、すべての3つに手動でデータを入力した後、3番目のテキストボックスに単一のスペースを貼り付けてみてください(そのために完全ではありませんその方法で送信者を送信する)、それは基本的に動作し、残りの部分を把握することができます(Tagプロパティを使用してテキストボックスを識別できます)。

+0

あなたの答えをありがとう。あなたがそれが唯一の賢明な答えだと言うのはなぜですか? Ctrl + V、コンテキストペースト、編集 - >ペーストの両方をキャプチャしますか? これにはさまざまな方法があるようです。ジェームズ・ヒル氏が上で提案したものでさえ、仕事が少ないようである。 – amadib

+0

@amadib Cltr + Vをキャプチャしているときに、コンテキストメニューからPasteを選択したときに通知を受け取ることができないため、マウスクリックをキャプチャしても非常に迅速にメンテナンスされるためです。さらに、JamesHillのコードは単にフォームに置くことはできません。フォームはWM_PASTEメッセージを処理しません。 [コントロールとコンボボックスの編集](http://msdn.microsoft.com/en-us/library/windows/desktop/ms649028(v = vs.85).aspx)を参照してください。 – CodeCaster

0

ボックスの文字数制限を増やしてTextChangedに登録し、貼り付けた(または入力した)テキストを次のTextBoxにジャンプ/切断すると長くすることができます。

+1

テキストが貼り付けられているかどうかを知る方法textchanged? –

+1

JamesやCodeCastersが答えます... – ChrFin

1

キーダウンイベントをバインドして、Ctrl + VまたはCtrl + vを取得したときに、3つのテキストボックスの値をclipboadの値で更新します。最初のテキストボックスからイベントをTextChangedにすることができます。

+0

コンテキストメニューから貼り付けを選択するのはどうですか? – CodeCaster

+0

この場合、コンテキストメニューを使用するとText_Changeイベントが発生します。 –

4

pasteイベントキャプチャ:必要なテキストを取得するためにClipboard objectにアクセスし、その後

protected override void WndProc(ref Message m) { 
    // Did paste occur? 
    if (m.Msg == 0x302) { 
     //Paste occurred, add your logic here 
    } 
    base.WndProc(ref m); 
} 

を。

1

あなたが撮影したテキスト String txt = Clipboard.GetText(); を取得し、他のテキストボックスの「テキスト」プロパティ