c# - 如何使用带有 C# 的 DllImport 在 OSX 上获取剪贴板文本?

标签 c# macos pinvoke dllimport

以下代码在 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";
}

最佳答案

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

关于c# - 如何使用带有 C# 的 DllImport 在 OSX 上获取剪贴板文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51909120/

相关文章:

c# - 使用正则表达式提取没有文件名的路径?

c# - LINQ to SQL 与带有聚合函数的 group by 子句

swift - 突出显示鼠标光标下的 NSWindow

c# - C# 如何在没有中间 C++ 层的情况下直接调用 ml64 dll?

c# - C# 中的 MVC 赢了。表格申请

c# - Xamarin.Forms 条目 - 自定义行为和 MVVM

python - 如何从搜索中排除可能正在使用或被复制到 python 中的文件?

macos - 应用程序应终止: not called when application closed on the red X

silverlight - 使用 Windows 8/WinRT 在 Metro 应用中 PInvoke

windows - 指定 pwszTimestampURL 时 CryptUIWizDigitalSign 失败