LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

C# WinForm下剪贴板操作 API 应用

admin
2025年5月30日 23:37 本文热度 69

在 Windows 桌面应用开发中,剪贴板是一个非常有用的功能,它允许用户在不同应用程序之间复制和粘贴数据。在 WinForms 应用程序中,我们可以通过调用 Win32 API 来实现剪贴板操作。本文将详细介绍如何在 WinForms 中进行剪贴板操作,并提供一个完整的示例。

引入命名空间

在开始之前,我们需要引用一些必要的命名空间:

using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;

Win32 API 声明

我们将使用一些 Win32 API 函数来访问剪贴板,这些函数包括:

  • OpenClipboard
  • CloseClipboard
  • EmptyClipboard
  • SetClipboardData
  • GetClipboardData
  • GlobalAlloc
  • GlobalLock
  • GlobalUnlock

在代码中声明这些 API 函数:

public class ClipboardAPI
{

    // 声明 Win32 API 函数
    [DllImport("user32.dll")]
    public static extern bool OpenClipboard(IntPtr hWnd);

    [DllImport("user32.dll")]
    public static extern bool CloseClipboard();

    [DllImport("user32.dll")]
    public static extern bool EmptyClipboard();

    [DllImport("user32.dll")]
    public static extern IntPtr SetClipboardData(uint uFormat, IntPtr hMem);

    [DllImport("user32.dll")]
    public static extern IntPtr GetClipboardData(uint uFormat);

    [DllImport("kernel32.dll")]
    public static extern IntPtr GlobalAlloc(uint uFlags, UIntPtr dwBytes);

    [DllImport("kernel32.dll")]
    public static extern IntPtr GlobalLock(IntPtr hMem);

    [DllImport("kernel32.dll")]
    public static extern bool GlobalUnlock(IntPtr hMem);

    // 定义数据格式
    publicconst uint CF_TEXT = 1;
}

复制文本到剪贴板

下面是一个将文本复制到剪贴板的方法:

public void CopyToClipboard(string text)
{
    // 打开剪贴板
    if (ClipboardAPI.OpenClipboard(IntPtr.Zero))
    {
        // 清空剪贴板
        ClipboardAPI.EmptyClipboard();

        IntPtr hGlobal = ClipboardAPI.GlobalAlloc(0, (UIntPtr)((text.Length + 1) * 2)); 
        if (hGlobal != IntPtr.Zero)
        {
            IntPtr pGlobal = ClipboardAPI.GlobalLock(hGlobal);
            Marshal.Copy(text.ToCharArray(), 0, pGlobal, text.Length);
            Marshal.WriteInt16(pGlobal, text.Length * 20); 
            ClipboardAPI.GlobalUnlock(hGlobal);
            ClipboardAPI.SetClipboardData(13, hGlobal);
            ClipboardAPI.CloseClipboard();
        }
    }
}

从剪贴板读取文本

下面是一个从剪贴板读取文本的方法:

public static string PasteFromClipboard()
{
    string result = string.Empty;

    // 打开剪贴板
    if (OpenClipboard(IntPtr.Zero))
    {
        // 获取剪贴板数据
        IntPtr hGlobal = GetClipboardData(ClipboardAPI.CF_TEXT);

        if (hGlobal != IntPtr.Zero)
        {
            // 锁定全局内存
            IntPtr pGlobal = ClipboardAPI.GlobalLock(hGlobal);

            // 读取文本
            result = Marshal.PtrToStringAnsi(pGlobal);

            // 解锁全局内存
            ClipboardAPI.GlobalUnlock(hGlobal);
        }

        // 关闭剪贴板
        CloseClipboard();
    }

    return result;
}

完整示例

接下来,我们将创建一个简单的 WinForms 应用程序,包含一个文本框和两个按钮,分别用于复制和粘贴。

using System.Runtime.InteropServices;

namespace AppCopyToClipboardApi
{
    public partial class Form1 : Form
    {
        public Form1()
        
{
            InitializeComponent();
        }

        private void btnCopy_Click(object sender, EventArgs e)
        
{
            CopyToClipboard(txt.Text);
        }

        private void btnPaste_Click(object sender, EventArgs e)
        
{
            txt.Text = PasteFromClipboard();
        }

        public string PasteFromClipboard()
        
{
            string result = string.Empty;

            // 打开剪贴板
            if (ClipboardAPI.OpenClipboard(IntPtr.Zero))
            {
                // 获取剪贴板数据
                IntPtr hGlobal = ClipboardAPI.GetClipboardData(ClipboardAPI.CF_TEXT);

                if (hGlobal != IntPtr.Zero)
                {
                    // 锁定全局内存
                    IntPtr pGlobal = ClipboardAPI.GlobalLock(hGlobal);

                    // 读取文本
                    result = Marshal.PtrToStringAnsi(pGlobal);

                    // 解锁全局内存
                    ClipboardAPI.GlobalUnlock(hGlobal);
                }

                // 关闭剪贴板
                ClipboardAPI.CloseClipboard();
            }

            return result;
        }

        public void CopyToClipboard(string text)
        
{
            // 打开剪贴板
            if (ClipboardAPI.OpenClipboard(IntPtr.Zero))
            {
                // 清空剪贴板
                ClipboardAPI.EmptyClipboard();

                IntPtr hGlobal = ClipboardAPI.GlobalAlloc(0, (UIntPtr)((text.Length + 1) * 2)); 
                if (hGlobal != IntPtr.Zero)
                {
                    IntPtr pGlobal = ClipboardAPI.GlobalLock(hGlobal);
                    Marshal.Copy(text.ToCharArray(), 0, pGlobal, text.Length);
                    Marshal.WriteInt16(pGlobal, text.Length * 20); 
                    ClipboardAPI.GlobalUnlock(hGlobal);
                    ClipboardAPI.SetClipboardData(13, hGlobal);
                    ClipboardAPI.CloseClipboard();
                }
            }
        }
    }
}

总结

通过调用 Win32 API,我们能够在 WinForms 应用程序中实现剪贴板的操作。本文提供了将文本复制和粘贴到剪贴板的完整示例,展示了如何使用 Windows API 来进行这些基本操作。这种方法可以为开发更复杂的剪贴板功能提供基础。


阅读原文:原文链接


该文章在 2025/6/2 13:02:11 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2025 ClickSun All Rights Reserved