在 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 * 2, 0);
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 * 2, 0);
ClipboardAPI.GlobalUnlock(hGlobal);
ClipboardAPI.SetClipboardData(13, hGlobal);
ClipboardAPI.CloseClipboard();
}
}
}
}
}
?
總結
通過調用 Win32 API,我們能夠在 WinForms 應用程序中實現剪貼板的操作。本文提供了將文本復制和粘貼到剪貼板的完整示例,展示了如何使用 Windows API 來進行這些基本操作。這種方法可以為開發更復雜的剪貼板功能提供基礎。
閱讀原文:原文鏈接
該文章在 2025/6/2 13:02:11 編輯過