2011-10-21 16 views
10

Quiero sobrescribir la función pegar cuando estoy en un cuadro de texto específico. Cuando el texto se pega en cuadro de texto que, quiero que se ejecute lo siguiente:Sobrescribir pegar en cuadro de texto

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

(El cambio de líneas múltiples a una sola)

¿Cómo puedo hacer esto?

+2

comprobar éste: http://stackoverflow.com/questions/3446233/hook-on-default-paste-event-of-winforms-textbox-control –

Respuesta

27

eso es posible, puede interceptar el mensaje de Windows de bajo nivel que el TextBox control nativo se que le dice que pegue desde el portapapeles. El mensaje WM_PASTE. Se genera cuando presiona Ctrl + V con el teclado o utiliza el comando Pegar del menú contextual. Lo atrapa anulando el método WndProc() del control, realizando el pegado como desee y no páselo a la clase base.

Agregue una nueva clase a su proyecto y copie/pegue el código que se muestra a continuación. Compilar. Coloque el nuevo control desde la parte superior de la caja de herramientas en su formulario, reemplazando el existente.

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

¿Pongo esto en Program.cs o Form1.cs? ¿Y necesito llamarlo de alguna manera? porque no está funcionando – cb1295

+2

Pones esto en una clase separada. Compilar. Coloque el nuevo control desde la parte superior de la caja de herramientas en su formulario. –

+1

Este código hizo el trabajo, por lo que obtendrá la respuesta. ¡¡¡Gracias!!! – cb1295

5

Para interceptar mensajes en el control de cuadro de texto, derivar una clase de TexBox y implemento

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

} 

sugirió here

+0

Si pongo esto en mi Form1.cs I recibe el siguiente error: Error No se puede acceder a un miembro no estático del tipo externo a través del tipo anidado y si lo pongo en Program.cs Dice que AddressTextBox no existe en el contexto actual. – cb1295

+2

Agregue una nueva clase a través de project-> Add New Item - class name it 'MyTb'. Cuando construyas el proyecto, MyTB aparecerá en la caja de herramientas. Puedes colocarlo en tu Formulario. –

+0

Gracias por la explicación detallada, sin embargo, su código no funcionó o no lo usé correctamente. ¡Gracias de todos modos! – cb1295

Cuestiones relacionadas