I'm trying to capture the WM_PASTE
message if I paste from the clipboard to an application outside my own, but it never fires. Is there any way to do this or am I stuck with using a keyboard hook?
Relevant Code:
//--dllImport
[DllImport("user32.dll")]
static extern IntPtr SetClipboardViewer(IntPtr hWndNewViewer);
[DllImport("user32.dll")]
static extern IntPtr GetClipboardViewer();
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool ChangeClipboardChain(IntPtr hWndRemove, IntPtr hWndNewNext);
[DllImport("user32.dll", SetLastError = true)]
static extern int SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);
IntPtr hWndNextWindow;
//--Variables
//--ClipboardHandler
protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case (0x0001): // WM_CREATE
hWndNextWindow = SetClipboardViewer(this.Handle);
break;
case (0x0002): // WM_DESTROY
ChangeClipboardChain(this.Handle, hWndNextWindow);
break;
case (0x030D): // WM_CHANGECBCHAIN
if (m.WParam == hWndNextWindow)
hWndNextWindow = m.LParam;
else if (hWndNextWindow != IntPtr.Zero)
SendMessage(hWndNextWindow, m.Msg, m.WParam, m.LParam);
break;
case (0x0308): // WM_DRAWCLIPBOARD
{
//DoStuff
}
SendMessage(hWndNextWindow, m.Msg, m.WParam, m.LParam);
break;
//WM_PASTE
case (0x0302):
//DEBUG
MessageBox.Show("PASTE");
break;
}
base.WndProc(ref m);
}