1

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

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

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

有人有想法么?

4

1 回答 1

2

确保无论你做什么来隐藏窗口都不会破坏它。从应用程序开始到终止,您的窗口句柄必须是相同的数字。因此,一点调试日志应该会告诉您在从托盘恢复后是否获得了与您最初开始(并随后注册)的句柄相同的句柄。

于 2013-02-27T22:03:33.230 回答