我正在尝试在 user32.dll 上使用 SetClipboardViewer 方法放置剪贴板挂钩
[DllImport("User32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr SetClipboardViewer(IntPtr hWndNewViewer);
然后我覆盖表单上的 WndProc 方法以捕获消息:
protected override void WndProc(ref Message message)
{
switch ((User32Handler.SystemMessages)message.Msg)
{
case User32Handler.SystemMessages.WM_DRAWCLIPBOARD:
if (MainForm.isFirstCopyPaste)
{
MainForm.isFirstCopyPaste = false;
return;
}
var data = Clipboard.GetDataObject();
if (data.GetDataPresent(DataFormats.Text))
{
NotifyIconMain.ShowBalloonTip(2000, "Text Copied", "Plain text copied", ToolTipIcon.Info);
}
User32Handler.SendMessage(_nextClipboardViewer, message.Msg, message.WParam, message.LParam);
break;
case User32Handler.SystemMessages.WM_CHANGECBCHAIN:
Debug.WriteLine("WM_CHANGECBCHAIN: lParam: " + message.LParam, "WndProc");
if (message.WParam == _nextClipboardViewer)
{
_nextClipboardViewer = message.LParam;
}
else
{
User32Handler.SendMessage(_nextClipboardViewer, message.Msg, message.WParam, message.LParam);
}
break;
default:
base.WndProc(ref message);
break;
}
}
我能够做到这一点,但我也想对用户隐藏窗口,并且只在系统托盘上显示它(而不是在任务栏上)。
当我从任务栏中隐藏窗口时,钩子停止工作。当我再次带回窗户时,它甚至不起作用。
有人有想法么?