C#实现的Windows剪贴板监视器功能实例【附demo源码下载】

C#实现的Windows剪贴板监视器功能实例

前言

剪贴板是我们在使用电脑时几乎必然会用到的功能之一,而剪贴板监视器的作用就是拦截剪贴板的相关操作,我们可以通过监视剪贴板来实现一些功能,如:自动翻译剪贴板内容等。在本文中,将通过C#实现Windows剪贴板监视器的功能,并附带Demo源码以及详细讲解。

实现剪贴板监视器

1. 创建项目

首先,我们需要创建一个C#控制台应用程序,命名为“ClipboardMonitor”。

2. 引入命名空间

在项目中引入命名空间System.Windows.Forms

3. 创建剪贴板监视器

定义一个类ClipboardMonitor,继承Form类,并实现接口IDisposable,用于启动一个Windows消息泵,并实现剪贴板监听器的功能。在类中添加以下代码:

public class ClipboardMonitor : Form, IDisposable
{
    private const int WM_DRAWCLIPBOARD = 0x308;
    private const int WM_CHANGECBCHAIN = 0x030D;

    [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);

    private IntPtr _clipboardViewerNext;

    public ClipboardMonitor()
    {
        _clipboardViewerNext = SetClipboardViewer(this.Handle);
    }

    protected override void WndProc(ref Message m)
    {
        switch (m.Msg)
        {
            case WM_DRAWCLIPBOARD:
                OnClipboardChanged();
                SendMessage(_clipboardViewerNext, m.Msg, m.WParam, m.LParam);
                break;
            case WM_CHANGECBCHAIN:
                if (m.WParam == _clipboardViewerNext)
                {
                    _clipboardViewerNext = m.LParam;
                }
                else
                {
                    SendMessage(_clipboardViewerNext, m.Msg, m.WParam, m.LParam);
                }
                break;
        }
        base.WndProc(ref m);
    }

    protected virtual void OnClipboardChanged()
    {
        IDataObject iData = Clipboard.GetDataObject();
        if (iData.GetDataPresent(DataFormats.Text))
        {
            string text = (string)iData.GetData(DataFormats.Text);
            Console.WriteLine("监测到剪贴板变化,当前内容为: " + text);
        }
    }

    public void Dispose()
    {
        ChangeClipboardChain(this.Handle, _clipboardViewerNext);
    }
}

以上代码主要实现了以下内容:

  • 定义了WM_DRAWCLIPBOARDWM_CHANGECBCHAIN常量,用于操作Windows消息。
  • 声明了SetClipboardViewerChangeClipboardChainSendMessage等方法,用于设置和改变剪贴板查看器。
  • 重写了WndProc方法,用于处理Windows消息。
  • 定义了OnClipboardChanged方法,用于处理剪贴板内容变化事件。
  • 实现了IDisposable接口,用于移除剪贴板查看器。

4. 使用剪贴板监视器

Main方法中,实例化ClipboardMonitor类,并调用Application.Run()方法启动Windows消息泵,代码如下:

static void Main(string[] args)
{
    using (ClipboardMonitor listener = new ClipboardMonitor())
    {
        Application.Run();
    }
}

当我们运行程序时,就可以监视剪贴板,实现一些我们想要的功能,如将剪贴板中的文本翻译为中文,可以在OnClipboardChanged方法中添加对应代码即可。

示例说明

示例一

使用剪贴板监视器实现将复制的英文文本自动翻译为中文。

protected override void OnClipboardChanged()
{
    IDataObject iData = Clipboard.GetDataObject();
    if (iData.GetDataPresent(DataFormats.Text))
    {
        string text = (string)iData.GetData(DataFormats.Text);
        Console.WriteLine("监测到剪贴板变化,当前内容为: " + text);

        // 调用翻译API将英文翻译为中文
        string translatedText = TranslateText(text, "en", "zh-CN");

        // 将翻译结果复制到剪贴板中
        Clipboard.SetDataObject(translatedText, true);
    }
}

private string TranslateText(string text, string sourceLanguage, string targetLanguage)
{
    // 调用第三方翻译API,将text从sourceLanguage翻译到targetLanguage
    // 代码实现略
    return translatedText;
}

以上代码主要实现了以下内容:

  • 当剪贴板内容变化时,调用翻译API将英文翻译为中文。
  • 将翻译结果复制到剪贴板中。

示例二

使用剪贴板监视器实现将截取屏幕上的图片保存到本地。

protected override void OnClipboardChanged()
{
    IDataObject iData = Clipboard.GetDataObject();
    if (iData.GetDataPresent(DataFormats.Bitmap))
    {
        Bitmap image = (Bitmap)iData.GetData(DataFormats.Bitmap);
        Console.WriteLine("监测到剪贴板变化,当前内容为一张图片");

        // 将图片保存到本地
        SaveImage(image);
    }
}

private void SaveImage(Bitmap image)
{
    // 生成图片名称
    string fileName = string.Format("{0}.jpg", DateTime.Now.ToString("yyyyMMddHHmmssfff"));

    // 图片保存路径
    string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, fileName);

    // 保存图片
    image.Save(path, ImageFormat.Jpeg);
}

以上代码主要实现了以下内容:

  • 当剪贴板内容变化时,判断是否为图片,如果是则调用SaveImage方法保存到本地。
  • 生成图片名称,并拼接图片保存路径。
  • 调用Save方法保存图片到本地。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#实现的Windows剪贴板监视器功能实例【附demo源码下载】 - Python技术站

(0)
上一篇 2023年6月8日
下一篇 2023年6月8日

相关文章

  • C#实现读取txt文件生成Word文档

    下面是”C#实现读取txt文件生成Word文档”的完整攻略: 1. 背景 在我们的开发过程中,经常需要将txt文本转化为Word文档,但Word文档是二进制格式的文档,不方便手动编辑,这时,我们可以通过C#程序来实现读取txt文件生成Word文档的操作。 2. 准备工作 安装Microsoft Office Word 16.0 Object Library …

    C# 2023年6月1日
    00
  • .Net设计模式之单例模式(Singleton)

    .Net设计模式之单例模式(Singleton) 什么是单例模式? 在软件系统中,有些类只需要存在唯一的一个实例对象,比如系统中的窗口管理器、文件系统、计时器等,这些对象在系统中只允许存在一个实例。单例模式就是为了满足这类需求而生的一种设计模式。 单例模式是指在整个应用程序中只能有一个实例对象的类。通常情况下,单例模式是指全局社区共享的一个唯一对象实例,比如…

    C# 2023年5月31日
    00
  • C#实现简单的五子棋游戏

    C#实现简单的五子棋游戏攻略 1. 确定游戏规则和UI设计 五子棋游戏有一定规则,包括游戏开始、棋子下子、禁手判断、胜负判断、悔棋等。首先需要了解游戏规则,并设计好游戏的UI界面,包括游戏棋盘的布局、棋子的显示、提示信息等。 2. 建立游戏主体框架 在C#中,我们可以使用Windows窗体应用程序来实现五子棋游戏的UI设计和游戏主体框架的建立。具体步骤如下:…

    C# 2023年6月7日
    00
  • C# TextWriter.WriteAsync – 异步写入一个字符

    TextWriter.WriteAsync 方法的作用与使用方法 TextWriter.WriteAsync 方法是 C# 中异步写入文本内容的方法,通过该方法可以在不阻塞主线程的情况下,将文本异步地写入到指定的文本流中。 该方法返回类型为 Task,表示该方法是异步执行的方法。 TextWriter.WriteAsync 方法的详细使用攻略 方法签名: p…

    C# 2023年4月19日
    00
  • C#多线程学习(一) 多线程的相关概念

    C#多线程学习(一) 多线程的相关概念 什么是进程? 当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源。 而一个进程又是由多个线程所组成的。 什么是线程? 线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针、程序计数器等), 但代码区是共享的,即不同的线程可以执行同样的函数。 什么是多线程? 多线程是指程序…

    C# 2023年4月17日
    00
  • 在.NET Core 中使用 FluentValidation 进行规则验证的方法

    在.NET Core 中使用 FluentValidation 进行规则验证的方法 在.NET Core应用程序中,数据验证是一个非常重要的部分。FluentValidation是一个流行的.NET验证库,它提供了灵活的验证规则和高度可定制的错误消息。本攻略将深入探讨如何在.NET Core中使用FluentValidation进行规则验证,并提供两个示例说…

    C# 2023年5月17日
    00
  • .NET Core部署到linux(CentOS)最全解决方案,入魔篇(使用Docker+Jenkins实现持续集成、自动化部署)

    通过前面三篇: .NET Core部署到linux(CentOS)最全解决方案,常规篇 .NET Core部署到linux(CentOS)最全解决方案,进阶篇(Supervisor+Nginx) .NET Core部署到linux(CentOS)最全解决方案,高阶篇(Docker+Nginx 或 Jexus) 通过前面三篇文章的介绍,我们已经对.net co…

    C# 2023年5月7日
    00
  • C# 读写编辑INI文件的操作

    C# 读写编辑INI文件的操作可以通过以下步骤完成: 步骤一:引入ini文件解析库 由于C#标准库中并未提供对ini文件的解析和读写操作,因此我们需要引入第三方库。比较常用的有iniFile和INIParser,这里以INIParser为例进行说明。首先需要在项目中安装INIParser库,可以通过NuGet包管理器直接安装。 步骤二:读取INI文件 读取I…

    C# 2023年6月1日
    00
合作推广
合作推广
分享本页
返回顶部