如何使用 C# 中的 DllImport 获取 OSX 上的剪贴板文本?
How to get the clipboard text on OSX using DllImport with c#?
以下代码在 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";
}
要从剪贴板获取数据,您需要添加对 Windows 的引用。关注
1) 项目:添加参考:网络:PresentationCore
2) 项目:添加引用:网络:WindowBase
3) 添加到模块顶部:使用 System.Windows;
4) 然后在代码中使用一种剪贴板方法,如 Clipboard.GetText();
正如 Hans 所指出的,考虑使用 NSPasteboard
Overview
The pasteboard server is shared by all running apps. It contains data that the user has cut or copied, as well as other data that one application wants to transfer to another. NSPasteboard objects are an application’s sole interface to the server and to all pasteboard operations.
An NSPasteboard object is also used to transfer data between apps and service providers listed in each application’s Services menu. The drag pasteboard is used to transfer data that is being dragged by the user.
您可以从这里获得更多详细信息 link: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]);
}
希望对您有所帮助!
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);
以下代码在 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";
}
要从剪贴板获取数据,您需要添加对 Windows 的引用。关注
1) 项目:添加参考:网络:PresentationCore
2) 项目:添加引用:网络:WindowBase
3) 添加到模块顶部:使用 System.Windows;
4) 然后在代码中使用一种剪贴板方法,如 Clipboard.GetText();
正如 Hans 所指出的,考虑使用 NSPasteboard
Overview The pasteboard server is shared by all running apps. It contains data that the user has cut or copied, as well as other data that one application wants to transfer to another. NSPasteboard objects are an application’s sole interface to the server and to all pasteboard operations.
An NSPasteboard object is also used to transfer data between apps and service providers listed in each application’s Services menu. The drag pasteboard is used to transfer data that is being dragged by the user.
您可以从这里获得更多详细信息 link: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]);
}
希望对您有所帮助!
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);