using System.Runtime.InteropServices; using System.Runtime.Versioning; using System.Text; namespace XFEExtension.NetCore.InputSimulator; /// /// 剪切板操作类 /// [SupportedOSPlatform("windows")] public static partial class Clipboard { /// /// 打开剪贴板以进行检查,并防止其他应用程序修改剪贴板内容 /// /// /// [LibraryImport("user32.dll")] [return: MarshalAs(UnmanagedType.Bool)] public static partial bool OpenClipboard(IntPtr hWndNewOwner); /// /// 清空剪贴板内容 /// /// [LibraryImport("user32.dll")] [return: MarshalAs(UnmanagedType.Bool)] public static partial bool EmptyClipboard(); /// /// 将数据放入剪贴板 /// /// /// /// [LibraryImport("user32.dll")] private static partial IntPtr SetClipboardData(uint uFormat, IntPtr data); /// /// 获取剪贴板数据 /// /// /// [LibraryImport("user32.dll")] private static partial IntPtr GetClipboardData(uint uFormat); /// /// 关闭剪贴板 /// /// [LibraryImport("user32.dll")] [return: MarshalAs(UnmanagedType.Bool)] public static partial bool CloseClipboard(); /// /// 分配内存 /// /// /// /// [LibraryImport("kernel32.dll", SetLastError = true)] public static partial IntPtr GlobalAlloc(uint uFlags, UIntPtr dwBytes); /// /// 锁定内存 /// /// /// [LibraryImport("kernel32.dll", SetLastError = true)] public static partial IntPtr GlobalLock(IntPtr hMem); /// /// 解锁内存 /// /// /// [LibraryImport("kernel32.dll", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] public static partial bool GlobalUnlock(IntPtr hMem); /// /// 设置剪贴板内容 /// /// /// /// public static bool SetClipboardContent(string text, uint format = ClipboardFormat.CF_UNICODETEXT) { if (!OpenClipboard(IntPtr.Zero)) return false; EmptyClipboard(); IntPtr hGlobal = GlobalAlloc(0x2000, (UIntPtr)((text.Length + 1) * 2)); IntPtr pGlobal = GlobalLock(hGlobal); byte[] bytes = Encoding.Unicode.GetBytes(text); Marshal.Copy(bytes, 0, pGlobal, bytes.Length); GlobalUnlock(hGlobal); SetClipboardData(format, hGlobal); CloseClipboard(); return true; } /// /// 获取剪贴板内容 /// /// /// public static object? GetClipboardContent(uint format = ClipboardFormat.CF_UNICODETEXT) { if (!OpenClipboard(IntPtr.Zero)) return null; IntPtr hClipboardData = GetClipboardData(format); if (hClipboardData == IntPtr.Zero) { CloseClipboard(); return null; } IntPtr pClipboardData = GlobalLock(hClipboardData); if (pClipboardData == IntPtr.Zero) { CloseClipboard(); return null; } var content = Marshal.PtrToStringAnsi(pClipboardData); GlobalUnlock(hClipboardData); CloseClipboard(); return content; } }