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");
}

参考资料:

win10监听剪切板变化 - _York - 博客园

c#: 剪切板监视实现的更多相关文章

  1. 通过mstsc复制粘贴失败需要重新启动RDP剪切板监视程序rdpclip.exe

    先结束程序 再重新启动程序

  2. 监视 Windows 剪切板

    一.先看代码 import win32con,win32gui import win32clipboard as cb class MyWindow(): def __init__(self): #注 ...

  3. 【笨嘴拙舌WINDOWS】实践检验之剪切板查看器【Delphi】

    该程序能够监视Windows剪切板的内容(文字和图片) 其思路是 先调用SetClipBoardViewer(Self.Handle),让Windows剪切板内容发生改变之后,通知本程序: 然后截获W ...

  4. Android 高仿UC浏览器监控剪切板弹出悬浮窗功能

    UC浏览器应该是android手机里 最流行的浏览器之一了,他们有一个功能 相信大家都体验过,就是如果你复制了什么文字,(在其他app中 复制也有这个效果!,所以能猜到肯定是监控了剪切板),就会弹出一 ...

  5. c#操作剪切板

    C#定义了一个类System.Windows.Forms.Clipboard来简化剪切板操作,这个类有一个静态方法,主要有: Clear 清除剪切板中的所有数据: ContainsData,Conta ...

  6. 对c#剪切板Clipboard占用的问题一点解决方法

    以前在百度写的文档,转移到此处 前几天做一个程序,其中有一个剪切板的操作,具体代码: Clipboard.SetText(“ABC”); 来完成一个复制字符串的操作. 自己调试通过,完全正常,然后就交 ...

  7. 在Java中调用与系统有关的剪切板Clipboard

    java从1.5版开始已经能与系统的剪切板很好的交互了. 如果可以在程序中直接调用系统的剪切板来保存“复制”的对象内容,那可以说的比之前的想法好很多. 下面是一个对java.io.File对象进行co ...

  8. 浏览器中用JavaScript获取剪切板中的文件

    本文转自我的个人网站  , 原文地址:http://www.zoucz.com/blog/2016/01/29/get-file-from-clipboard/  ,欢迎前往交流讨论 在网页上编辑内容 ...

  9. WPF剪切板问题-OpenClipboard HRESULT:0x800401D0 (CLIPBRD_E_CANT_OPEN))

    WPF剪切板问题-OpenClipboard HRESULT:0x800401D0 (CLIPBRD_E_CANT_OPEN))       最近碰到一个问题,需要弄个小工具来解决.刚好接触到WPF, ...

随机推荐

  1. gcd与exgcd

    gcd 辗转相除法求gcd证明 \(gcd(a, b) == gcd(b, a\%b)\) 证明: 设: \(d\)为\(a\)与\(b\)的一个公约数, 则有\(d|b\) \(d|a\) 设: \ ...

  2. 利用$a_n$与$S_n$的关系求通项$a_n$

    前言 由\(a_n\)与\(S_n\)的关系求数列\(\{a_n\}\)的通项公式,在求通项公式题型中占有比较大的份额,是一个重要的求解思路和方法.是要求重点掌握的类型. 一.方法依据 二者关系:\( ...

  3. git提交代码时出现was rejected by remote错误

    git常见问题 git是大家在公司基本都项目管理工具,有一次在改了一个bug提交远程提交就出现问题了. 解决方案 首先这个是远程提交的时候被项目权限拦截掉了,一般在我们都用配置ssh公钥的方式操作,那 ...

  4. 【BigData】Java基础_方法的定义与使用

    1.概念 Java语言中的“方法”(Method)在其他语言当中也可能被称为“函数”(Function).对于一些复杂的代码逻辑,如果希望重复使用这些代码,并且做到“随时任意使用”,那么就可以将这些代 ...

  5. C语言-memset()

    1. memset()函数原型是extern void *memset(void *buffer, int c, int count)        buffer:为指针或是数组, c:是赋给buff ...

  6. java的sha1加密,转化为python版本

    java的加密方法如下: public class EncryptUtil { /** 16进制 : 16 */ private static final int HEX = 16; /** SHA: ...

  7. C# 激活主窗口

    今天同学跟我说了一个bug,虽然很简单,但还是记录一下,也好让我养成写东西的习惯. C# windows form 程序中,发生某个事件时,需要自动弹出一个窗口,提示用户,并等待用户输入进行处理. 如 ...

  8. React组件介绍与使用(父传子、子传父、兄弟传)

    1.创建组件的方法     1.1.函数式无状态组件 1.1.1.语法 1 function myComponent(props) { 2 return 3 <div>Hello {pro ...

  9. python数据分析4之自动采集数据

    1 数据采集的重要性 数据采集是数据挖掘的基础,没有数据,挖掘也没有意义.很多时候,我们拥有多少数据源,多少数据量,以及数据质量如何,将决定我们挖掘产出的成果会怎样 2 四类采集方式 3 如何使用开放 ...

  10. 关于JavaSE程序的小总结(不分先后顺序 后续继续补充)

    统计字符串中某个字符串出现的次数 package com.jiang.demo01; public class Demo01 { public static void main(String[] ar ...