我有一个SQL4.0控制台应用程序,它生成.NET并将其存储在字符串变量中。我希望将此字符串直接复制到剪贴板。
到目前为止,我的所有研究表明,唯一可能做到这一点的方法是添加一个对System.Windows.Forms的引用。我不想添加对与控制台应用程序无关的程序集的引用。
在我们目前所处的世界中,有没有一种已知的方法可以将文本字符串复制到控制台应用程序中的剪贴板中,而不涉及添加对System.Windows.Forms或任何其他与基本控制台应用程序无关的程序集的引用?
发布于 2012-11-27 03:15:45
Platform invoking剪贴板API是一种可能的解决方案。示例:
using System.Runtime.InteropServices;
class Program
{
[DllImport("user32.dll")]
internal static extern bool OpenClipboard(IntPtr hWndNewOwner);
[DllImport("user32.dll")]
internal static extern bool CloseClipboard();
[DllImport("user32.dll")]
internal static extern bool SetClipboardData(uint uFormat, IntPtr data);
[STAThread]
static void Main(string[] args)
{
OpenClipboard(IntPtr.Zero);
var yourString = "Hello World!";
var ptr = Marshal.StringToHGlobalUni(yourString);
SetClipboardData(13, ptr);
CloseClipboard();
Marshal.FreeHGlobal(ptr);
}
}
这只是一个例子。在代码周围添加一些错误处理,比如检查P/Invoke函数的返回值,这将是一个很好的补充。
SetClipboardData
是一个有趣的部分。您还需要确保打开和关闭剪贴板。
作为第一个参数传入的13
是数据格式。13 means a Unicode string。
发布于 2014-07-11 21:49:01
Marshal.StringToHGlobalUni
函数实际上以一种不适合SetClipboardData (using LocalAlloc with LMEM_FIXED)
的方式分配内存,这可能会导致崩溃(给定方法名称,您可能不会想到它,但单步执行代码,例如使用ReSharper会揭示这一点)。
根据文档SetClipboardData on MSDN,SetClipboardData
需要带有GMEM_MOVABLE
的GlobalAlloc
。
这是一个麻省理工学院许可的System.Windows.Forms替代方案,经过测试并完成了错误处理:Clippy
(可以在这里找到剪贴板推送代码本身:Clippy.cs。)
https://stackoverflow.com/questions/13571426
复制相似问题