zoukankan      html  css  js  c++  java
  • 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);
            }
        }
  • 相关阅读:
    VIM 配色方案,先保存一下
    ncurses库的介绍与安装
    win7 设置双屏壁纸
    3. Vim入门教程
    2. Vim 概念扫盲
    把Debian 设置中文环境
    静态代码块和构造代码块的区别
    jsp详解(3个指令、6个动作、9个内置对象、11个隐式对象)
    JVM虚拟机详解
    Java 的内置对象
  • 原文地址:https://www.cnblogs.com/feiyuhuo/p/5077220.html
Copyright © 2011-2022 走看看