以下代码在OSX上设置剪贴板文本。读剪贴板文本相当于什么?
static class OsxClipboard
{
public static void SetText(string text)
{
var nsString = objc_getClass("NSString");
var str = objc_msgSend(objc_msgSend(nsString, sel_registerName("alloc")), sel_registerName("initWithUTF8String:"), text);
var dataType = objc_msgSend(objc_msgSend(nsString, sel_registerName("alloc")), sel_registerName("initWithUTF8String:"), NSPasteboardTypeString);
var nsPasteboard = objc_getClass("NSPasteboard");
var generalPasteboard = objc_msgSend(nsPasteboard, sel_registerName("generalPasteboard"));
objc_msgSend(generalPasteboard, sel_registerName("clearContents"));
objc_msgSend(generalPasteboard, sel_registerName("setString:forType:"), str, dataType);
objc_msgSend(str, sel_registerName("release"));
objc_msgSend(dataType, sel_registerName("release"));
}
[DllImport("/System/Library/Frameworks/AppKit.framework/AppKit")]
static extern IntPtr objc_getClass(string className);
[DllImport("/System/Library/Frameworks/AppKit.framework/AppKit")]
static extern IntPtr objc_msgSend(IntPtr receiver, IntPtr selector);
[DllImport("/System/Library/Frameworks/AppKit.framework/AppKit")]
static extern IntPtr objc_msgSend(IntPtr receiver, IntPtr selector, string arg1);
[DllImport("/System/Library/Frameworks/AppKit.framework/AppKit")]
static extern IntPtr objc_msgSend(IntPtr receiver, IntPtr selector, IntPtr arg1, IntPtr arg2);
[DllImport("/System/Library/Frameworks/AppKit.framework/AppKit")]
static extern IntPtr sel_registerName(string selectorName);
const string NSPasteboardTypeString = "public.utf8-plain-text";
}
答案 0 :(得分:2)
public static string GetText()
{
var nsString = objc_getClass("NSString");
var nsPasteboard = objc_getClass("NSPasteboard");
var nsStringPboardType = objc_msgSend(objc_msgSend(nsString, sel_registerName("alloc")), sel_registerName("initWithUTF8String:"), "NSStringPboardType");
var generalPasteboard = objc_msgSend(nsPasteboard, sel_registerName("generalPasteboard"));
var ptr = objc_msgSend(generalPasteboard, sel_registerName("stringForType:"), nsStringPboardType);
var charArray = objc_msgSend(ptr, sel_registerName("UTF8String"));
return Marshal.PtrToStringAnsi(charArray);
}
[DllImport("/System/Library/Frameworks/AppKit.framework/AppKit")]
static extern IntPtr objc_getClass(string className);
[DllImport("/System/Library/Frameworks/AppKit.framework/AppKit")]
static extern IntPtr objc_msgSend(IntPtr receiver, IntPtr selector);
[DllImport("/System/Library/Frameworks/AppKit.framework/AppKit")]
static extern IntPtr objc_msgSend(IntPtr receiver, IntPtr selector, string arg1);
[DllImport("/System/Library/Frameworks/AppKit.framework/AppKit")]
static extern IntPtr objc_msgSend(IntPtr receiver, IntPtr selector, IntPtr arg1);
[DllImport("/System/Library/Frameworks/AppKit.framework/AppKit")]
static extern IntPtr sel_registerName(string selectorName);
答案 1 :(得分:0)
正如汉斯指出的那样,请考虑使用 NSPasteboard
概述 粘贴板服务器由所有正在运行的应用程序共享。它包含用户已剪切或复制的数据,以及一个应用程序想要传输到另一个应用程序的其他数据。 NSPasteboard对象是应用程序与服务器以及所有粘贴板操作的唯一接口。
NSPasteboard对象还用于在每个应用程序的“服务”菜单中列出的应用程序和服务提供商之间传输数据。拖动粘贴板用于传输用户拖动的数据。
您可以从以下链接获得更多详细信息:https://developer.apple.com/documentation/appkit/nspasteboard
这是复制和粘贴字符串的简单示例:
private static string[] pboardTypes = new string[] { "NSStringPboardType" };
public static void SetText(string text)
{
NSPasteboard.GeneralPasteboard.DeclareTypes(pboardTypes, null);
NSPasteboard.GeneralPasteboard.SetStringForType(text, pboardTypes[0]);
}
public static string GetText()
{
return NSPasteboard.GeneralPasteboard.GetStringForType(pboardTypes[0]);
}
希望这会有所帮助!
答案 2 :(得分:-5)
要从剪贴板获取数据,您需要添加对Windows的引用。跟着做
1)项目:添加参考:网络:PresentationCore
2)项目:添加参考:网络:WindowBase
3)添加到模块顶部:使用System.Windows;
4)然后在代码中使用Clipboard方法之一,例如Clipboard.GetText();。