Eseguire il subclassing in NET e' diventato un gioco da ragazzi (o quasi...) basta fare l'override della WndProc e trappare i messaggi interessati, ma se volessi intercettare il messaggio WM_LBUTTONCLICK di un pulsante presente in un form?
Si puo' usare la classe NativeWindow che rappresenta una finestra generica con la relativa WndProc e "associarla" alla finestra che vogliamo subclassare.

Esempio:

public class MySubClass : System.Windows.Forms.NativeWindow
{
public delegate void MsgTrap (ref System.Windows.Forms.Message m);
public event MsgTrap MessageTrapped;
private Int32 msgCode;
public MySubClass(IntPtr handle, Int32 msgCode )
{
this.msgCode=msgCode;
base.AssignHandle(handle);
}
protected override void WndProc(ref System.Windows.Forms.Message m)
{
base.WndProc(ref m);
if (m.Msg==msgCode)
 {
  MessageTrapped (ref m);
 }
}
}

Questa classe, che eredita da NativeWindow, genera un evento quando viene intercettato il messaggio passato nel costruttore.

Come la uso?

MySubClass ms=new MySubClass(button1.Handle,0x201);
ms.MessageTrapped+=new NativeWindow.Form1.MySubClass.MsgTrap(msgCatch);

private void msgCatch(ref Message m)
{
Console.WriteLine(m.Msg);
}

Quando la classe ha un handle associtao non verra' distrutta dal GC quindi ricordamoci di invocare ReleaseHandle() quando non ci serve piu'.
La classe offre molte altre possibilita', dateci un occhiata...