Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用DllImport和c#在OSX上获取剪贴板文本?_C#_Macos_Pinvoke_Dllimport - Fatal编程技术网

如何使用DllImport和c#在OSX上获取剪贴板文本?

如何使用DllImport和c#在OSX上获取剪贴板文本?,c#,macos,pinvoke,dllimport,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_re

下面的代码设置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) 项目:添加引用:Net:WindowBase

3) 添加到模块顶部:使用System.Windows


4) 然后在代码中使用剪贴板方法之一,如Clipboard.GetText()

>汉斯指出,考虑使用<强> NSPAISTABE>强/

概述 粘贴板服务器由所有正在运行的应用程序共享。它包含用户剪切或复制的数据,以及一个应用程序希望传输到另一个应用程序的其他数据。NSPasteboard对象是应用程序与服务器和所有粘贴板操作的唯一接口

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

希望这有帮助

这个问题有一个答案:@dj79你能重新打开你的答案吗。它帮助我找到了答案,所以我想奖励你bounty@Simon,完成。非常感谢。剪贴板方法执行的所有操作都调用user32:yes。它提供了一个在OSX上不可用的api,该api不使用dll导入方法问题的标题明确指出“使用dllImport”
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);