有一种更简单的方法来在C#控制台应用程序中使用Windows ctrl + v(粘贴)function吗?

我已经构build了一个具有命令解释器的控制台应用程序。 为了使事情更容易,我需要添加支持阅读剪贴板时按CTRL + V按下。 当我按Ctrl + V时 ,在控制台中看到符号^ V ,所以我用剪贴板文本replace那个字符。 一些谷歌search后,我发现剪贴板可以通过System.Windows.Forms.Clipboard.GetText()访问。

我的问题是: 是否有一个更好的解决scheme将剪贴板支持添加到控制台应用程序? 可能没有使用System.Windows.Forms.Clipboard? 也许一个互操作性的电话可以做到这一点?

这个解决scheme的一个缺点是剪贴板只有在线程被定义为[STAThread]时才起作用。 如果我能摆脱^ V符号,也会好很多。

这是当前解决scheme的代码:

using System; using System.Threading; using System.Windows.Forms; namespace ConsoleApplication1 { class Program { public static readonly string ClipboardChar = Convert.ToChar(22).ToString(); [STAThread] static void Main(string[] args) { Console.Write("Do some pastin': "); //read Console.ForegroundColor = ConsoleColor.White; string result = Console.ReadLine(); Console.ResetColor(); //read keyboard if (result.Contains(ClipboardChar)) { result = result.Replace(ClipboardChar, Clipboard.GetText()); } //write result Console.WriteLine("\nResult: "); Console.ForegroundColor = ConsoleColor.White; Console.WriteLine(result); Console.ResetColor(); Console.WriteLine("\nPress any key to continue..."); Console.ReadKey(); } } } 

Solutions Collecting From Web of "有一种更简单的方法来在C#控制台应用程序中使用Windows ctrl + v(粘贴)function吗?"

你当然可以使用P / Invoke来做到这一点。 请将示例代码视为概念验证,因为它已经被迅速拼凑并测试完毕。 我采取了一些自由 – 例如我的GlobalLock原型返回string虽然Win API真的返回LPVOID

 using System; using System.Runtime.InteropServices; namespace clipboard { class Program { public static void Main(string[] args) { 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); } } 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; 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 = 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; } } } 

如果您单击控制台应用程序窗口左上角的图标,则会显示“编辑”| '粘贴'选项。