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 に答える