首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在带有c#的DllImport上获得剪贴板文本?

如何在带有c#的DllImport上获得剪贴板文本?
EN

Stack Overflow用户
提问于 2018-08-18 21:24:25
回答 2查看 516关注 0票数 5

下面的代码在OSX上设置剪贴板文本。什么等同于阅读剪贴板文本?

代码语言:javascript
复制
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";
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-24 11:58:21

代码语言:javascript
复制
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);
票数 3
EN

Stack Overflow用户

发布于 2018-08-18 23:53:12

要从剪贴板获取数据,您需要添加对Windows的引用。下面也是如此

1)项目:添加引用: Net : PresentationCore

2)项目:添加引用: Net : WindowBase

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

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

票数 -6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51909120

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档