C++;在Linux上从剪贴板获取字符串 你好,我正在写一个C++程序,我需要把剪贴板上的内容变成字符串变量。我找到了很多解决方案,但都是为windows编写的。有没有不使用QT库的方法?我发现了一些与X11相关的东西,但也不是很明确
非常感谢您是否尝试首先找到的不是代码而是带有实现的程序?我为您做了这件事,发现了许多使用直接X11调用的实现。我认为最有价值的是你也可以阅读。只要找到任何程序并查找源代码即可。尝试在维基百科上查看哪些应用程序使用x11剪贴板/选择系统 以下程序专门用于数据传输 机制:C++;在Linux上从剪贴板获取字符串 你好,我正在写一个C++程序,我需要把剪贴板上的内容变成字符串变量。我找到了很多解决方案,但都是为windows编写的。有没有不使用QT库的方法?我发现了一些与X11相关的东西,但也不是很明确,c++,linux,codeblocks,clipboard,x11,C++,Linux,Codeblocks,Clipboard,X11,非常感谢您是否尝试首先找到的不是代码而是带有实现的程序?我为您做了这件事,发现了许多使用直接X11调用的实现。我认为最有价值的是你也可以阅读。只要找到任何程序并查找源代码即可。尝试在维基百科上查看哪些应用程序使用x11剪贴板/选择系统 以下程序专门用于数据传输 机制: xcutsel将数据从选择传输到剪切缓冲区,反之亦然 xclipboard、glipper(Gnome)、parcellite(LXDE)和klipper(KDE)是 剪贴板管理器,可能wmcliphist以及xcb显示 剪切缓冲
xcutsel
将数据从选择传输到剪切缓冲区,反之亦然
xclipboard
、glipper
(Gnome)、parcellite
(LXDE)和klipper
(KDE)是
剪贴板管理器,可能wmcliphist
以及xcb
显示
剪切缓冲区并允许用户对其进行操作
xclip
、xsel
和xcopy
是将数据复制到或的命令行程序
从X选择。xcopy有一个详细选项,可以帮助调试X
选择问题。parcellite还具有从和读取数据的能力
从命令行写入特定的X选择
synergy
是一种跨平台工具,允许您跨平台共享剪贴板
运行多个操作系统的多台计算机
xfce4 clipman插件
是xfce4的“剪贴板历史”插件
面板”和剪贴板管理器xtranslate在
多语言词典中的Xselection自动剪切同步剪切缓冲区
和选择缓冲区
简而言之,从理论上讲,X11有两个“剪贴板”:实际上是一个键盘,用于选择-您立即选择的文本可以通过按下鼠标中键粘贴到任何您想要的地方,而实际的“键盘”是为主/默认剪贴板目的制作的,用于不同类型对象的交换
另外,在我的经历之后,我不会再使用x11了。享受:)X11使用灵活的多缓冲区多格式异步应用程序端剪贴板协议 大多数工具包都实现了它(GTK的
GTK\U剪贴板\U get()
,Qt的QApplication::clipboard()
,Tk的)。但您可以使用X11API手动执行此操作,例如,如果您不使用工具包,或者如果您必须通过剪贴板缓冲区传递大量数据,而不同时将其全部保留在内存中
理论
缓冲区可能很多,但您只需要知道两个:
是常用的显式缓冲区:您可以使用“编辑/复制”菜单将内容复制到剪贴板上,然后使用“编辑/粘贴”菜单将其粘贴CLIPBOARD
选择是一种隐式鼠标选择功能:当使用鼠标光标选择时,文本会进入其中,并在文本输入字段中单击鼠标中键时从中粘贴PRIMARY
UTF8\u STRING
格式,并返回到STRING
当您要求另一个应用程序准备缓冲区时,这可能需要一些时间,请求是异步的:所有者准备缓冲区,将其保存在指定位置(窗口属性用作临时存储),并在完成时用SelectionNotify
事件通知您
因此,要获得缓冲区:
- 选择缓冲区名称(
,CLIPBOARD
),格式 (PRIMARY
,UTF8_STRING
)和存储结果的窗口属性STRING
- 调用
请求缓冲区XConvertSelection()
- 等待
选择通知
事件
- 从窗口属性读取缓冲区内容
//gcc-o xclipget xclipget.c-lX11
#包括
#包括
#包括
Bool打印选择(显示*显示,窗口窗口,常量字符*bufname,常量字符*fmtname)
{
字符*结果;
未签名的长字符串,重新插入;
int resbits;
Atom bufid=XInternAtom(显示,bufname,False),
fmtid=XInternAtom(显示,fmtname,False),
propid=XInternAtom(显示“XSEL_数据”,假),
incrid=XInternAtom(显示“INCR”,假);
XEvent事件;
XConvertSelection(显示、bufid、fmtid、propid、窗口、当前时间);
做{
XNextEvent(显示和事件);
}while(event.type!=SelectionNotify | | event.xselection.selection!=bufid);
if(event.xselection.property)
{
XGetWindowProperty(显示、窗口、propid、0