gpt4 book ai didi

c# - 在 C# 控制台应用程序中使用 Windows ctrl+v(粘贴)功能是否有更简单的方法?

转载 作者:可可西里 更新时间:2023-11-01 13:51:03 25 4
gpt4 key购买 nike

我构建了一个带有命令解释器的控制台应用程序。为了使事情变得更容易,我需要添加对在按下 ctrl+v 时读取剪贴板的支持。当我按下 ctrl+v 时,我在控制台中看到符号 ^V,所以我用剪贴板文本替换该字符。经过一些谷歌搜索后,我发现剪贴板可以通过 System.Windows.Forms.Clipboard.GetText() 访问。

我的问题是:是否有更好的解决方案来为控制台应用程序添加剪贴板支持?可能不使用 System.Windows.Forms.Clipboard?也许互操作调用可以解决问题?

此解决方案的缺点之一是剪贴板仅在线程定义为 [STAThread] 时才起作用。如果我能去掉 ^V 符号,那就更好了。

这是当前解决方案的代码:

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

最佳答案

您当然可以使用 P/Invoke 来完成此操作。请将示例代码视为概念验证,因为它是快速拼凑和测试的。我有一些自由 - 例如我的 GlobalLock 原型(prototype)返回 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;
}
}
}

关于c# - 在 C# 控制台应用程序中使用 Windows ctrl+v(粘贴)功能是否有更简单的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4711971/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com