CR TubeGet中有用户需要剪切板监视功能,记录代码以做备忘:
using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace CRTubeGet
{
/// <summary>
/// Provides notifications when the contents of the clipboard is updated.
/// </summary>
public sealed class ClipboardNotification
{
public const int WM_CLIPBOARDUPDATE = 0x031D;
[DllImport("user32.dll", SetLastError = true)]
public static extern bool AddClipboardFormatListener(IntPtr hWnd);
[DllImport("user32.dll", SetLastError = true)]
public static extern bool RemoveClipboardFormatListener(IntPtr hWnd);
/// <summary>
/// Occurs when the contents of the clipboard is updated.
/// </summary>
public event MethodInvoker ClipboardUpdate;
public ClipboardNotification()
{
new NotificationForm(OnClipboardUpdate);
}
/// <summary>
/// Raises the <see cref="ClipboardUpdate"/> event.
/// </summary>
/// <param name="e">Event arguments for the event.</param>
private void OnClipboardUpdate()
{
var handler = ClipboardUpdate;
if (handler != null)
handler();
}
/// <summary>
/// Hidden form to recieve the WM_CLIPBOARDUPDATE message.
/// </summary>
private class NotificationForm : Form
{
private MethodInvoker onClipboardUpdate;
private IntPtr hWnd;
private int lastTickCount;
public NotificationForm(MethodInvoker onClipboardUpdate)
{
this.onClipboardUpdate = onClipboardUpdate;
this.hWnd = this.Handle;
AddClipboardFormatListener(this.hWnd);
}
~NotificationForm()
{
RemoveClipboardFormatListener(this.hWnd);
}
protected override void WndProc(ref Message m)
{
if (m.Msg == WM_CLIPBOARDUPDATE && this.onClipboardUpdate != null)
{
//列表类解析,会阻止时间,用此法不行,再用lastText方法
if (Environment.TickCount - this.lastTickCount >= 200)
this.onClipboardUpdate();
this.lastTickCount = Environment.TickCount;
m.Result = IntPtr.Zero;
}
base.WndProc(ref m);
}
}
}
}
期间所见问题为有些Copy事件会触发两次甚至更多WM_CLIPBOARDUPDATE消息,比如下载任务之[复制URL]操作。因此,以Environment.TickCount间隔值做为判断条件。
使用方法:
private void StartClipboardWatch()
{
var cn = new ClipboardNotification();
cn.ClipboardUpdate += cn_ClipboardUpdate;
}
private void cn_ClipboardUpdate()
{
if (!App.WatchClipboard || !Clipboard.ContainsText() || Program.ModalLevel != 0)
return;
this.downloadPage.Download(false, true);
GA.TrackEvent(DataType.Download, "From", "WatchClipboard");
}
参考资料:

浙公网安备 33010602011771号