2010-08-10 18 views

Respuesta

16

Mientras que yo no sugeriría normalmente cayendo a bajo nivel API de Windows, y esto puede no ser la única manera de hacer esto, que sí hace el truco:

using System; 
using System.Windows.Forms; 

public class ClipboardEventArgs : EventArgs 
{ 
    public string ClipboardText { get; set; } 
    public ClipboardEventArgs(string clipboardText) 
    { 
     ClipboardText = clipboardText; 
    } 
} 

class MyTextBox : TextBox 
{ 
    public event EventHandler<ClipboardEventArgs> Pasted; 

    private const int WM_PASTE = 0x0302; 
    protected override void WndProc(ref Message m) 
    { 
     if (m.Msg == WM_PASTE) 
     { 
      var evt = Pasted; 
      if (evt != null) 
      { 
       evt(this, new ClipboardEventArgs(Clipboard.GetText())); 
       // don't let the base control handle the event again 
       return; 
      } 
     } 

     base.WndProc(ref m); 
    } 
} 

static class Program 
{ 
    /// <summary> 
    /// The main entry point for the application. 
    /// </summary> 
    [STAThread] 
    static void Main() 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 

     var tb = new MyTextBox(); 
     tb.Pasted += (sender, args) => MessageBox.Show("Pasted: " + args.ClipboardText); 

     var form = new Form(); 
     form.Controls.Add(tb); 

     Application.Run(form); 
    } 
} 

En definitiva, la WinForms guía no es muy bueno . Es una envoltura delgada sobre Win32 y los controles comunes. Expone el 80% de la API que es más útil. El otro 20% a menudo falta o no está expuesto de una manera que es obvia. Sugeriría alejarse de WinForms y de WPF si es posible, ya que WPF parece ser un mejor marco de arquitectura para .NET GUI.

+0

gracias, acabo de aprender algo nuevo (no solo cómo atrapar "pegar", nuez una manera de hacer cosas) – David

+0

palabra clave de evento falta en la declaración de campo pegado y ¿por qué está usando una variable local evt? – Maxence

+0

@Maxence, FTFY. – dahvyd

Cuestiones relacionadas