2011-10-21 3 views
10

특정 텍스트 상자에있는 경우 붙여 넣기 기능을 무시하고 싶습니다. 텍스트는 그 텍스트 상자에 붙여 넣을 때, 나는 다음과 같은 실행하려는 :텍스트 상자에 붙여 넣기 재정의

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

(하나에 여러 줄에서 변경)

내가 어떻게 할 수 있습니까? 텍스트 상자 컨트롤에 메시지를 차단하려면

+2

확인이 하나 http://stackoverflow.com/questions/3446233/hook-on-default-paste-event-of-winforms-textbox-control –

답변

27

, 당신은 낮은 수준의 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); 
    } 

} 

네이티브 TextBox 제어를 얻을 수있을 가능성이 here

+0

내에서 Form1.cs I에 넣고 경우 다음 오류가 발생합니다. 오류 중첩 형식을 통해 외부 형식의 비 정적 멤버에 액세스 할 수 없습니다. Program.cs에 넣으면 현재 상황에서 AddressTextBox가 존재하지 않는다고 표시됩니다. – cb1295

+2

프로젝트 -> 새 항목 추가 - 클래스 이름으로 'MyTb'를 통해 새 클래스를 추가하십시오. 프로젝트를 빌드하면 도구 상자에 MyTB가 나타납니다. 양식에 배치 할 수 있습니다. –

+0

자세한 설명을 주셔서 감사합니다. 그러나 코드가 트릭을하지 않았거나 올바르게 사용하지 않았습니다. 어쨌든 고마워! – cb1295

관련 문제