在 C# WinForm 应用程序中切换监视剪贴板

Toggle monitoring clipboard in C# WinForm app

目前我有一个监控 windows 剪贴板的应用程序。如果有任何更改,它会在文本框中显示剪贴板文本。我正在使用通过谷歌搜索找到的以下代码-

[DllImport("User32.dll")]
protected static extern int SetClipboardViewer(int hWndNewViewer);

[DllImport("User32.dll", CharSet = CharSet.Auto)]
public static extern bool ChangeClipboardChain(IntPtr hWndRemove, IntPtr hWndNewNext);

[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern int SendMessage(IntPtr hwnd, int wMsg, IntPtr wParam, IntPtr lParam);

IntPtr nextClipboardViewer;       

public frmMain()
{
    InitializeComponent();
    nextClipboardViewer = (IntPtr)SetClipboardViewer((int)this.Handle);
}

protected override void WndProc(ref System.Windows.Forms.Message m)
{
    // defined in winuser.h
    const int WM_DRAWCLIPBOARD = 0x308;
    const int WM_CHANGECBCHAIN = 0x030D;

    switch (m.Msg)
    {
        case WM_DRAWCLIPBOARD:
                DisplayClipboardData();
                SendMessage(nextClipboardViewer, m.Msg, m.WParam, m.LParam);
            break;

        case WM_CHANGECBCHAIN:
            if (m.WParam == nextClipboardViewer)
                nextClipboardViewer = m.LParam;
            else
                SendMessage(nextClipboardViewer, m.Msg, m.WParam, m.LParam);
            break;

        default:
            base.WndProc(ref m);
            break;
    }
}

以上代码运行良好。但现在我会动态地处理它。像-

private void chkToggleMonitor_CheckedChanged(object sender, EventArgs e)
{
    if (chkToggleMonitor.CheckState==CheckState.Checked)
    {
        //Monitor clipboard
    }
    else
    {
        //Don't monitor clipboard
    }
}

有什么办法可以根据当前的剪贴板代码来做吗? 谢谢

要将应用程序添加到 Windows 剪贴板侦听器,请使用:

[DllImport("user32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool AddClipboardFormatListener(IntPtr hwnd);

并将其从列表中删除使用:

[DllImport("user32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool RemoveClipboardFormatListener(IntPtr hwnd);

最终你可以在你的代码中使用它,就像这样:

if (chkToggleMonitor.CheckState==CheckState.Checked)
{
    AddClipboardFormatListener(this.Handle);
}
else
{
    RemoveClipboardFormatListener(this.Handle);
}