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);
        }
    }

 

posted @ 2015-12-25 23:01  Nullobj  阅读(4446)  评论(0编辑  收藏  举报