Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;在Linux上从剪贴板获取字符串 你好,我正在写一个C++程序,我需要把剪贴板上的内容变成字符串变量。我找到了很多解决方案,但都是为windows编写的。有没有不使用QT库的方法?我发现了一些与X11相关的东西,但也不是很明确_C++_Linux_Codeblocks_Clipboard_X11 - Fatal编程技术网

C++;在Linux上从剪贴板获取字符串 你好,我正在写一个C++程序,我需要把剪贴板上的内容变成字符串变量。我找到了很多解决方案,但都是为windows编写的。有没有不使用QT库的方法?我发现了一些与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显示 剪切缓冲

非常感谢

您是否尝试首先找到的不是代码而是带有实现的程序?我为您做了这件事,发现了许多使用直接X11调用的实现。我认为最有价值的是你也可以阅读。只要找到任何程序并查找源代码即可。尝试在维基百科上查看哪些应用程序使用x11剪贴板/选择系统

以下程序专门用于数据传输 机制:

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
    选择是一种隐式鼠标选择功能:当使用鼠标光标选择时,文本会进入其中,并在文本输入字段中单击鼠标中键时从中粘贴
主选择不需要按键,所以它对于在相邻窗口之间复制小片段非常有用。这个特性主要是unix特有的,但我见过putty、trillian和一些gtk应用程序在Windows操作系统上模拟它。另外,firefox在中键单击页面的空白非交互空间时还具有“粘贴和转到”功能

优化应用程序端的缓冲区:应用程序只告诉服务器“我拥有它”,而不是在每次更改时将整个剪贴板/选择推送到服务器。要获取缓冲区,请请求所有者提供其内容。这样,即使是一个大的缓冲区,在实际请求之前也不会占用任何资源

请求缓冲区时,请向所有者请求所需的特定格式。例如,从seamonkey浏览器复制的图像(右键单击图像并按“复制图像”)可以用不同的格式表示。若你们把它粘贴到终端上,它会显示为图像URL。如果你将它粘贴到libreofficewriter中,它将成为从该URL加载的图片。如果粘贴到gimp中,它将是图像本身。这是因为seamonkey是智能的,为每个应用程序提供了它所要求的格式:终端的文本字符串、libreoffice的html和gimp的图像数据。要请求文本格式,您需要使用
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