Как получить текст буфера обмена на OSX, используя DllImport с 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";
}

3 ответа

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

Как отметил Ганс, рассмотрите возможность использования 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]);
}

Надеюсь это поможет!

Чтобы получить данные из буфера обмена, необходимо добавить ссылку на Windows. Так что следуйте

1) Проект: Добавить ссылку: Net: PresentationCore

2) Проект: Добавить ссылку: Net: WindowBase

3) Добавить в начало модуля: используя System.Windows;

4) Затем в коде используйте один из методов буфера обмена, например Clipboard.GetText();

Другие вопросы по тегам