我正在尝试在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;
}
}
我能够实现这一点,但我也想隐藏用户的窗口,并且只在系统托盘上显示它(不在任务栏上)。
当我从任务栏隐藏窗口时,钩子停止工作。当我再次把窗户拉回来时它甚至不起作用。
有人有什么想法吗?
答案 0 :(得分:2)
确保无论你做什么来隐藏窗户都没有破坏它。从应用程序启动到终止,您的窗口句柄必须是相同的编号。因此,一些调试日志记录应该告诉您从托盘恢复后是否有相同的句柄,这是您最初开始使用(并随后注册)。