如果我从剪贴板粘贴到我自己以外的应用程序,我正在尝试捕获WM_PASTE
消息,但它永远不会触发。有没有办法做到这一点,还是我坚持使用键盘钩?
相关守则:
//--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);
}