在 Windows 桌面應(yīng)用開發(fā)中,剪貼板是一個(gè)非常有用的功能,它允許用戶在不同應(yīng)用程序之間復(fù)制和粘貼數(shù)據(jù)。在 WinForms 應(yīng)用程序中,我們可以通過調(diào)用 Win32 API 來實(shí)現(xiàn)剪貼板操作。本文將詳細(xì)介紹如何在 WinForms 中進(jìn)行剪貼板操作,并提供一個(gè)完整的示例。
引入命名空間 在開始之前,我們需要引用一些必要的命名空間:
using System; using System.Windows.Forms; using System.Runtime.InteropServices;
Win32 API 聲明 我們將使用一些 Win32 API 函數(shù)來訪問剪貼板,這些函數(shù)包括:
OpenClipboard
CloseClipboard
EmptyClipboard
SetClipboardData
GetClipboardData
GlobalAlloc
GlobalLock
GlobalUnlock
在代碼中聲明這些 API 函數(shù):
public class ClipboardAPI { // 聲明 Win32 API 函數(shù) [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) ; // 定義數(shù)據(jù)格式 public const uint CF_TEXT = 1 ; }
復(fù)制文本到剪貼板 下面是一個(gè)將文本復(fù)制到剪貼板的方法:
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(); } } }
從剪貼板讀取文本 下面是一個(gè)從剪貼板讀取文本的方法:
public static string PasteFromClipboard () { string result = string .Empty; // 打開剪貼板 if (OpenClipboard(IntPtr.Zero)) { // 獲取剪貼板數(shù)據(jù) IntPtr hGlobal = GetClipboardData(ClipboardAPI.CF_TEXT); if (hGlobal != IntPtr.Zero) { // 鎖定全局內(nèi)存 IntPtr pGlobal = ClipboardAPI.GlobalLock(hGlobal); // 讀取文本 result = Marshal.PtrToStringAnsi(pGlobal); // 解鎖全局內(nèi)存 ClipboardAPI.GlobalUnlock(hGlobal); } // 關(guān)閉剪貼板 CloseClipboard(); } return result; }
完整示例 接下來,我們將創(chuàng)建一個(gè)簡(jiǎn)單的 WinForms 應(yīng)用程序,包含一個(gè)文本框和兩個(gè)按鈕,分別用于復(fù)制和粘貼。
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)) { // 獲取剪貼板數(shù)據(jù) IntPtr hGlobal = ClipboardAPI.GetClipboardData(ClipboardAPI.CF_TEXT); if (hGlobal != IntPtr.Zero) { // 鎖定全局內(nèi)存 IntPtr pGlobal = ClipboardAPI.GlobalLock(hGlobal); // 讀取文本 result = Marshal.PtrToStringAnsi(pGlobal); // 解鎖全局內(nèi)存 ClipboardAPI.GlobalUnlock(hGlobal); } // 關(guān)閉剪貼板 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(); } } } } }
?
總結(jié) 通過調(diào)用 Win32 API,我們能夠在 WinForms 應(yīng)用程序中實(shí)現(xiàn)剪貼板的操作。本文提供了將文本復(fù)制和粘貼到剪貼板的完整示例,展示了如何使用 Windows API 來進(jìn)行這些基本操作。這種方法可以為開發(fā)更復(fù)雜的剪貼板功能提供基礎(chǔ)。
閱讀原文:原文鏈接
該文章在 2025/6/2 13:02:11 編輯過