如何使用隐藏的WinForm设置剪贴板挂钩?

时间:2013-02-27 15:51:59

标签: c# winforms clipboard

我正在尝试在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;
        }
    }

我能够实现这一点,但我也想隐藏用户的窗口,并且只在系统托盘上显示它(不在任务栏上)。

当我从任务栏隐藏窗口时,钩子停止工作。当我再次把窗户拉回来时它甚至不起作用。

有人有什么想法吗?

1 个答案:

答案 0 :(得分:2)

确保无论你做什么来隐藏窗户都没有破坏它。从应用程序启动到终止,您的窗口句柄必须是相同的编号。因此,一些调试日志记录应该告诉您从托盘恢复后是否有相同的句柄,这是您最初开始使用(并随后注册)。