C# Mono Linux - 抓取全局剪贴板的内容
C# Mono Linux - Grab contents of global clipboard
我只是想 "grab" 剪贴板中的文本并放入一个变量中。我在做这件事时遇到了很多麻烦。我试过使用
Gtk.Clipboard.Get(Gdk.Atom.Intern("PRIMARY", true))
我目前的代码,只是 returns "Gtk.Clipboard" 到 TextBox entry1.
Gtk.Clipboard clipboard = Gtk.Clipboard.Get(Gdk.Atom.Intern("PRIMARY", true));
string textClip = clipboard.ToString ();
entry1.Text = textClip;
所以我无法用它做任何有成效的事情。
尝试使用这段代码从系统剪贴板中获取文本;
Gtk.Clipboard clipboard = Gtk.Clipboard.Get(Gdk.Atom.Intern("CLIPBOARD", false));
var text = clipboard.WaitForText();
您也可以使用 klipper DBus 接口。
这样,您就可以避免对 GTK# 的依赖。
这是 Klipper DBus 接口的代码(对于 Whosebug 来说有点大):
https://pastebin.com/HDsRs5aG
和摘要class:
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 需要摘要 class 才能在 get/set 属性 中同步。
实际剪贴板处理不需要 AsyncEx,只要您不想在同步上下文中使用 get/set 剪贴板内容。
注意: klipper 必须是 运行(如果您使用 KDE,它就是)。
我只是想 "grab" 剪贴板中的文本并放入一个变量中。我在做这件事时遇到了很多麻烦。我试过使用
Gtk.Clipboard.Get(Gdk.Atom.Intern("PRIMARY", true))
我目前的代码,只是 returns "Gtk.Clipboard" 到 TextBox entry1.
Gtk.Clipboard clipboard = Gtk.Clipboard.Get(Gdk.Atom.Intern("PRIMARY", true));
string textClip = clipboard.ToString ();
entry1.Text = textClip;
所以我无法用它做任何有成效的事情。
尝试使用这段代码从系统剪贴板中获取文本;
Gtk.Clipboard clipboard = Gtk.Clipboard.Get(Gdk.Atom.Intern("CLIPBOARD", false));
var text = clipboard.WaitForText();
您也可以使用 klipper DBus 接口。
这样,您就可以避免对 GTK# 的依赖。
这是 Klipper DBus 接口的代码(对于 Whosebug 来说有点大):
https://pastebin.com/HDsRs5aG
和摘要class:
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 需要摘要 class 才能在 get/set 属性 中同步。 实际剪贴板处理不需要 AsyncEx,只要您不想在同步上下文中使用 get/set 剪贴板内容。
注意: klipper 必须是 运行(如果您使用 KDE,它就是)。