【问题标题】:C# Mono Linux - Grab contents of global clipboardC# Mono Linux - 获取全局剪贴板的内容
【发布时间】:2015-01-02 10:37:36
【问题描述】:

我试图简单地从剪贴板中“抓取”文本并将其放入变量中。我在做这件事时遇到了很多麻烦。我试过用

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;

所以我无法用这个做任何有成效的事情。

【问题讨论】:

  • 请显示您到目前为止尝试了什么
  • 我已经用我当前使用的代码更新了问题。

标签: c# gtk clipboard


【解决方案1】:

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

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

欲了解更多信息mono documentation

【讨论】:

  • 谢谢,这行得通!你能解释一下为什么在这种情况下使用 var 吗?
  • 默认剪贴板对应“CLIPBOARD”原子;另一个常用的剪贴板是“PRIMARY”剪贴板,在 X 中,它通常包含当前选定的文本。要将剪贴板内容作为任意数据块获取,还有将其作为文本检索的函数 Clipboard.RequestText() 和 Clipboard.WaitForText()。这些函数负责确定剪贴板提供程序所宣传的格式,以最佳可用格式请求剪贴板并将结果转换为 UTF-8 编码。 (在 Gtk# 中表示字符串的标准形式。
  • 谢谢!感谢您的宝贵时间。
  • clipboard 变量为空,所以我在第二行得到一个空指针。我什至不知道从哪里开始寻找,知道可能是什么问题吗?
【解决方案2】:

您也可以使用 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,则必须运行)。

【讨论】:

    猜你喜欢
    • 2011-09-18
    • 1970-01-01
    • 1970-01-01
    • 2015-11-30
    • 1970-01-01
    • 2010-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多