C# 控制台程序实现 Ctrl + V 粘贴功能
代码主要分为两部分,首先调用系统API注册剪切板相关的事件,然后监控用户的按键操作。完整代码如下:
class ClipBoard { [DllImport("user32.dll", SetLastError = true)] private static extern Int32 IsClipboardFormatAvailable(uint format); [DllImport("user32.dll", SetLastError = true)] private static extern Int32 OpenClipboard(IntPtr hWndNewOwner); [DllImport("user32.dll", SetLastError = true)] private static extern IntPtr GetClipboardData(uint uFormat); [DllImport("user32.dll", SetLastError = true)] private static extern Int32 CloseClipboard(); [DllImport("kernel32.dll", SetLastError = true)] private static extern Int32 GlobalLock(IntPtr hMem); [DllImport("kernel32.dll", SetLastError = true)] private static extern Int32 GlobalUnlock(IntPtr hMem); [DllImport("kernel32.dll")] public static extern UIntPtr GlobalSize(IntPtr hMem); const uint CF_TEXT = 1; /// <summary> /// 实现控制台自动粘贴板功能 /// </summary> /// <returns></returns> public static string PasteTextFromClipboard() { string result = ""; if (IsClipboardFormatAvailable(CF_TEXT) == 0) { return result; } if (OpenClipboard((IntPtr)0) == 0) { return result; } IntPtr hglb = GetClipboardData(CF_TEXT); if (hglb != (IntPtr)0) { UIntPtr size = GlobalSize(hglb); IntPtr s = (IntPtr)GlobalLock(hglb); byte[] buffer = new byte[(int)size]; Marshal.Copy(s, buffer, 0, (int)size); if (s != null) { result = ASCIIEncoding.ASCII.GetString(buffer); GlobalUnlock(hglb); } } CloseClipboard(); return result; } /// <summary> /// 监控用户输入的按键 /// </summary> public void KeyPress() { ConsoleKeyInfo ki = Console.ReadKey(true); if ((ki.Key == ConsoleKey.V) && (ki.Modifiers == ConsoleModifiers.Control)) { Console.WriteLine("Ctrl+V pressed"); string s = ClipBoard.PasteTextFromClipboard(); Console.WriteLine(s); } Console.Write("Press any key to continue . . . "); Console.ReadKey(true); } }