2012-01-23 7 views
1

패널이있는 검색 화면을 포함하는 .net 응용 프로그램이 있습니다. 세 개의 텍스트 상자가 각각 문자 길이가 다양한입니다. 내가하고 싶은 무엇여러 텍스트 상자에 붙여 넣기

캡처이 첫 번째 상자에서를 호출하여 세 개의 상자에 내 클립 보드를 붙여 붙여 넣기 명령.

이 기능은 직렬 키 및 전화 번호에 대한 입력을 허용하는 많은 최신 응용 프로그램과 유사합니다.

+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); 
     } 
    } 
} 

을,이 경우, 동일한 방법으로 세 가지 텍스트 상자에 OnPaste 이벤트를 할당 I 그것은 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) 
    { } 

} 

. 위의 코드는 완벽하지 않습니다. 세 개의 텍스트 상자에 수동으로 데이터를 입력 한 후 세 번째 텍스트 상자에 하나의 공백을 붙여 넣으십시오. 예를 들어 이벤트의 매개 변수를 변경하여 텍스트를 붙여 넣은 텍스트 상자를 알면 좋을 것입니다. 그 방법은 보낸 사람을 보내는)하지만 기본적으로 작동하고 나머지는 알아낼 수있을 것 같아요 (Tag 속성을 사용하여 텍스트 상자를 식별 할 수 있습니다).

+0

답변 해 주셔서 감사합니다. 질문을 따르는 것이 왜 유일한 합리적인 대답이라고 말합니까? Ctrl + V, 컨텍스트 붙여 넣기 및 편집 -> 붙여 넣기를 캡처합니까? 많은 방법이있는 것처럼 보입니다. 심지어 제임스 힐 (James Hill)이 제안한 제안조차도 덜 효과적 인 것처럼 보입니다. – amadib

+0

@amadib Cltr + V를 캡쳐하는 동안 사용자가 상황에 맞는 메뉴에서 붙여 넣기를 선택하면 알림을받지 못하기 때문에 마우스 클릭 만 캡처하면 유지 보수 지옥이 될 수 있습니다. 또한 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을 얻으면 clipboad의 값으로 세 텍스트 상자의 값을 업데이트합니다. 첫 번째 텍스트 상자에서 이벤트를 TextChanged 이벤트에서 수행 할 수 있습니다.

+0

상황에 맞는 메뉴에서 붙여 넣기를 선택하는 방법은 무엇입니까? – CodeCaster

+0

그런 경우 컨텍스트 메뉴를 사용하는 경우 Text_Change 이벤트가 발생합니다. –

4

캡처 붙여 넣기 이벤트 :

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

에서, Clipboard object에 액세스하여 원하는 텍스트를 얻을 수 있습니다.

1

캡쳐 된 텍스트 String txt = Clipboard.GetText(); 를 얻고 다른 텍스트 상자의 "텍스트"속성

관련 문제