C#Mono Linux - 获取全局剪贴板的内容 -

时间:2015-01-02 10:37:36

标签: c#

我想简单地#34; Grab"夹板上的文字并放入变量中。我这样做有很多麻烦。我试过用

Gtk.Clipboard.Get(Gdk.Atom.Intern("PRIMARY", true)

我到目前为止的代码,只返回" Gtk.Clipboard"到TextBox entry1。

Gtk.Clipboard clipboard = Gtk.Clipboard.Get(Gdk.Atom.Intern("PRIMARY", true));
string textClip = clipboard.ToString ();

entry1.Text = textClip;

所以我无法做到这一点。

2 个答案:

答案 0 :(得分:1)

尝试使用这段代码从系统剪贴板中获取文本;

Gtk.Clipboard clipboard = Gtk.Clipboard.Get(Gdk.Atom.Intern("CLIPBOARD", false));
var text = clipboard.WaitForText();

了解更多信息mono documentation

答案 1 :(得分:0)

您还可以使用klipper DBus接口。
这样,您可以避免依赖GTK#。

以下是Klipper DBus接口的代码(对于stackoverflow来说有点大):
https://pastebin.com/HDsRs5aG

和抽象类:
https://pastebin.com/939kDvP8

以及实际的剪贴板代码(需要Tmds.Dbus-用于处理DBus)

using System.Threading.Tasks;

namespace TestMe
{
    using NiHaoRS; // TODO: Rename namespaces to TestMe

    public class LinuxClipboard
        : GenericClipboard

    {

        public LinuxClipboard()
        { }


        public static async Task TestClipboard()
        {
            GenericClipboard lc = new LinuxClipboard();
            await lc.SetClipboardContentsAsync("Hello KLIPPY");
            string cc = await lc.GetClipboardContentAsync();
            System.Console.WriteLine(cc);
        } // End Sub TestClipboard 


        public override async Task SetClipboardContentsAsync(string text)
        {
            Tmds.DBus.ObjectPath objectPath = new Tmds.DBus.ObjectPath("/klipper");
            string service = "org.kde.klipper";

            using (Tmds.DBus.Connection connection = new Tmds.DBus.Connection(Tmds.DBus.Address.Session))
            {
                await connection.ConnectAsync();

                Klipper.DBus.IKlipper klipper = connection.CreateProxy<Klipper.DBus.IKlipper>(service, objectPath);
                await klipper.setClipboardContentsAsync(text);
            } // End using connection 

        } // End Task SetClipboardContentsAsync 


        public override async Task<string> GetClipboardContentAsync()
        {
            string clipboardContents = null;

            Tmds.DBus.ObjectPath objectPath = new Tmds.DBus.ObjectPath("/klipper");
            string service = "org.kde.klipper";

            using (Tmds.DBus.Connection connection = new Tmds.DBus.Connection(Tmds.DBus.Address.Session))
            {
                await connection.ConnectAsync();

                Klipper.DBus.IKlipper klipper = connection.CreateProxy<Klipper.DBus.IKlipper>(service, objectPath);

                clipboardContents = await klipper.getClipboardContentsAsync();
            } // End Using connection 

            return clipboardContents;
        } // End Task GetClipboardContentsAsync 


    } // End Class LinuxClipBoardAPI 


} // End Namespace TestMe
抽象类需要

AsyncEx才能在get / set属性中进行同步。 只要您不想在同步上下文中使用获取/设置剪贴板内容,实际的剪贴板处理就不需要AsyncEx。

注意:klipper必须正在运行(如果使用KDE,则为运行状态)。