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# Directory.Exists – 判断目录是否存在

    Directory.Exists是C#中用于判断指定路径的文件夹是否存在的方法,其返回值为布尔类型,如果存在则返回true,否则返回false。 Directory.Exists方法的使用方法: bool exists = Directory.Exists(path); 其中,path参数为字符串类型的要检查的目录路径。此时exists变量的值为true或f…

    C# 2023年4月19日
    00
  • C# DateTime.AddDays()方法: 将指定的天数加到指定的日期上

    DateTime.AddDays()是C#中DateTime结构体提供的一个方法,用于将DateTime对象的日期值增加指定的天数。其方法的声明如下: public DateTime AddDays(double value); 其中value参数为需要增加的天数,可以是一个正数,也可以是一个负数。 以下是使用该方法的两个实例: 计算一个日期的前一天 假设有…

    C# 2023年4月19日
    00
  • ASP.NET Core在Linux下为dotnet创建守护进程

    ASP.NET Core在Linux下为dotnet创建守护进程 在Linux下,可以使用systemd来创建守护进程,以确保ASP.NET Core应用程序在系统启动时自动启动,并在崩溃时自动重启。本攻略将提供一些示例,演示如何在Linux下为dotnet创建守护进程。 步骤 步骤1:创建.NET Core Web API项目 首先,需要创建一个.NET …

    C# 2023年5月17日
    00
  • c# 使用Task实现非阻塞式的I/O操作

    下面是详细讲解“c# 使用Task实现非阻塞式的I/O操作”的完整攻略。 简介 在进行I/O操作时,如果我们在单线程中进行了阻塞式I/O操作,那么在I/O等待时间内,该线程无法执行其他操作,导致I/O操作效率极低。因此,我们需要使用非阻塞的I/O操作,使得I/O操作的等待时间内能够执行其他操作,提高操作效率。 Task是.Net Framework和.Net…

    C# 2023年6月3日
    00
  • WinForm实现按名称递归查找控件的方法

    下面开始讲解WinForm实现按名称递归查找控件的方法的攻略。 什么是WinForm? WinForm是Windows Forms的缩写,是一个在Windows操作系统上创建桌面应用程序的API。WinForm允许开发人员在Windows的桌面环境中创建GUI应用程序,通过WinForm框架,开发人员可以方便地创建一个能够响应用户操作的UI。 控件查找的应用…

    C# 2023年6月6日
    00
  • C#实现简单超市收银系统

    C#实现简单超市收银系统攻略 本攻略将会让您学习如何使用C#编写一个简单的超市收银系统。这个系统可以进行基本的商品库存管理和结算功能,包含了商品添加、修改、查询和删除功能。此外,当用户选购完商品后,系统会对商品进行结算并输出购物清单和价格信息。 1. 搭建环境 在开始编写代码之前,我们需要先搭建好我们的编程环境,需要准备以下工具: Visual Studio…

    C# 2023年6月6日
    00
  • C#中fixed关键字的作用总结

    下面是详细讲解”C#中fixed关键字的作用总结”的攻略。 什么是fixed? Fixed是一个C#中的关键字,它和指针密切相关。通常用于控制指针的生命周期,避免指针操作引起内存泄露的问题。它在使用指针访问不安全的内存时非常有用。 fixed的作用 限制指针的生命周期 当我们使用指针访问内存的时候,如果不加任何限制,指针操作会导致内存泄露,而fixed关键字…

    C# 2023年6月3日
    00
  • VB 书籍

    VB 书籍攻略 如果你正在寻找一本好的 VB 书籍,以下是一些建议和提示,可以使你更容易找到适合你的书。 初学者 《Visual Basic 6.0从入门到精通》 这本书对于那些没有编程经验且想学习 VB 的人非常有帮助。它从基础开始,详细介绍了语言的各个方面,包括变量、数据类型、运算符、控制结构等。同时,它还提供了许多示例,演示如何使用 VB 来实现各种功…

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