c#: 剪切板监视实现

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 - 博客园

原文地址:https://www.cnblogs.com/crwy/p/11257725.html

时间: 2024-09-29 01:16:59

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

剪切板-监视剪贴板

相关资料: http://user.qzone.qq.com/513187410/blog/1265981516 实例原码: 1 unit Unit1; 2 3 interface 4 5 uses 6 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 7 Dialogs, StdCtrls, ExtCtrls, 8 Clipbrd, jpeg; //Clipboard使用 9 10 type 1

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

以前在百度写的文档,转移到此处 前几天做一个程序,其中有一个剪切板的操作,具体代码: Clipboard.SetText(“ABC”); 来完成一个复制字符串的操作. 自己调试通过,完全正常,然后就交给一位朋友做测试.但是他告诉我这个复制操作总是引起崩溃.并弹出“请求剪切板失败”的提示.于是在网上找了一下相关的内容,原来是不同进程之间争用剪切板引起的,剪切板是系统的公用资源,大多数软件都会提供对该区域访问的操作,就以迅雷为例:迅雷有一个监视剪切板的功能,具体实现不清楚,但肯定的是会经常去访问剪切

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

java从1.5版开始已经能与系统的剪切板很好的交互了. 如果可以在程序中直接调用系统的剪切板来保存“复制”的对象内容,那可以说的比之前的想法好很多. 下面是一个对java.io.File对象进行copy,paste操作的例子,虽然还不完善,但可以在程序中很好的使用. /* * 定义为传输操作提供数据所使用的类的接口 * 专用于java.io.File类型 */ package angel.datatransfer; import java.awt.datatransfer.*; import

js复制内容到剪切板,兼容pc和手机端,支持Safari浏览器

最近,一些项目中用到监听用户复制.剪切的操作. 案例1.在PC端,当用户获得一个京东卡的使用券,当用户使用ctrl + C复制得到的使用券时,将使用券的代号复制到粘贴板,以便于用户ctrl+v进行粘贴. 案例2:在移动端(android 和 iOS端),用户获得邀请码之后,可以使用一键复制的功能,将邀请码复制到剪切板,然后在app中进行兑换. 使用jQuery中的方法监听用户的剪切.复制.粘贴的行为 $("#cut").on("cut",function(){ al

复制到剪切板 兼容(IE/FF/Chrome/..)

最近做一个复制到剪切板的功能   在网上找了很多都不好用 最后发现在了  这篇文章很不错  简洁好用   贴出来  希望能帮到更多人 原文地址:http://www.lsproc.com/wiki/snippets:copytoclipboard 此代码修改自 discuz!, 简易实现 <script> var clipboardswfdata; var setcopy_gettext = function(){ clipboardswfdata = document.getElementB

C# 线程间不能调用剪切板的问题

最近做一个项目,需要用到线程,而且要用到剪切板,创建了一个子线程之后发现在子线程中剪切板上获取不到数据,当时特别纳闷,上网查资料,最后终于搞定,现将解决方法归纳如下: 第一步: public void btnAutoFocus_Click(object sender,EventArgs e) { Thread myThread = new Thread(msc.AutoFocusArithmetic); //注意,一般启动一个线程的时候没有这句话,但是要操作剪切板的话这句话是必需要加上的,因为剪

iOS社交分享Twitter、Facebook、复制到剪切板、LINE、及邮件

准备 首先要引进如下三个framework: MessageUI.framework Social.framework Accounts.framework 并在实现这几个方法的地方引入以下几个头文件 #import <MessageUI/MFMailComposeViewController.h> #import <Social/Social.h> #import <Accounts/Accounts.h> Twitter及Facebook 其中urlStr为我分享的

复原所有面板设置+剪切板

* 复原所有面板设置 * 文件 -> 新建 -> 剪切板 复原所有面板设置+剪切板,码迷,mamicode.com

vi中系统剪切板的设置

在vi中,如果编译时没有clipboard属性,将vi中的内容拷贝到系统剪切板有些麻烦.可以用如下的方法,查看vi 是否支持系统剪切板的功能: [email protected]:~$ vi --version | grep clipboard -clipboard +iconv +path_extra -toolbar +eval +mouse_dec +startuptime -xterm_clipboard 如果如上所示,不支持系统剪切板功能,可以如下在.vimrc中的设置,解决问题: "