真奇怪啊。关于LINUX剪贴板的C代码,网上完全找不到。找到的都是一些SHELL命令。

经过千辛万苦,自己理解,终于找到一个代码范例。

  • https://github.com/exebook/x11clipboard
  • https://stackoverflow.com/questions/27378318/c-get-string-from-clipboard-on-linux

为了方便他人,提供代码如下(初步测试表明,图片取不到数据):

  • 标准情况:
// gcc -o xclipget xclipget.c -lX11
#include <stdio.h>
#include <limits.h>
#include <X11/Xlib.h>Bool PrintSelection(Display *display, Window window, const char *bufname, const char *fmtname)
{char *result;unsigned long ressize, restail;int resbits;Atom bufid = XInternAtom(display, bufname, False),fmtid = XInternAtom(display, fmtname, False),propid = XInternAtom(display, "XSEL_DATA", False),incrid = XInternAtom(display, "INCR", False);XEvent event;XConvertSelection(display, bufid, fmtid, propid, window, CurrentTime);do {XNextEvent(display, &event);} while (event.type != SelectionNotify || event.xselection.selection != bufid);if (event.xselection.property){XGetWindowProperty(display, window, propid, 0, LONG_MAX/4, False, AnyPropertyType,&fmtid, &resbits, &ressize, &restail, (unsigned char**)&result);if (fmtid == incrid)printf("Buffer is too large and INCR reading is not implemented yet.\n");elseprintf("%.*s", (int)ressize, result);XFree(result);return True;}else // request failed, e.g. owner can't convert to the target formatreturn False;
}int main()
{Display *display = XOpenDisplay(NULL);unsigned long color = BlackPixel(display, DefaultScreen(display));Window window = XCreateSimpleWindow(display, DefaultRootWindow(display), 0,0, 1,1, 0, color, color);Bool result = PrintSelection(display, window, "CLIPBOARD", "UTF8_STRING") ||PrintSelection(display, window, "CLIPBOARD", "STRING");XDestroyWindow(display, window);XCloseDisplay(display);return !result;
}
  • 超大内存情况
// gcc -o xclipget xclipget.c -lX11
#include <stdio.h>
#include <limits.h>
#include <X11/Xlib.h>Bool PrintSelection(Display *display, Window window, const char *bufname, const char *fmtname)
{char *result;unsigned long ressize, restail;int resbits;Atom bufid = XInternAtom(display, bufname, False),fmtid = XInternAtom(display, fmtname, False),propid = XInternAtom(display, "XSEL_DATA", False),incrid = XInternAtom(display, "INCR", False);XEvent event;XSelectInput (display, window, PropertyChangeMask);XConvertSelection(display, bufid, fmtid, propid, window, CurrentTime);do {XNextEvent(display, &event);} while (event.type != SelectionNotify || event.xselection.selection != bufid);if (event.xselection.property){XGetWindowProperty(display, window, propid, 0, LONG_MAX/4, True, AnyPropertyType,&fmtid, &resbits, &ressize, &restail, (unsigned char**)&result);if (fmtid != incrid)printf("%.*s", (int)ressize, result);XFree(result);if (fmtid == incrid)do {do {XNextEvent(display, &event);} while (event.type != PropertyNotify || event.xproperty.atom != propid || event.xproperty.state != PropertyNewValue);XGetWindowProperty(display, window, propid, 0, LONG_MAX/4, True, AnyPropertyType,&fmtid, &resbits, &ressize, &restail, (unsigned char**)&result);printf("%.*s", (int)ressize, result);XFree(result);} while (ressize > 0);return True;}else // request failed, e.g. owner can't convert to the target formatreturn False;
}int main()
{Display *display = XOpenDisplay(NULL);unsigned long color = BlackPixel(display, DefaultScreen(display));Window window = XCreateSimpleWindow(display, DefaultRootWindow(display), 0,0, 1,1, 0, color, color);Bool result = PrintSelection(display, window, "CLIPBOARD", "UTF8_STRING") ||PrintSelection(display, window, "CLIPBOARD", "STRING");XDestroyWindow(display, window);XCloseDisplay(display);return !result;
}

LINUX X11剪贴板/clipboard访问C代码范例相关推荐

  1. Manjaro Linux vim 剪贴板clipboard与系统互通

    首先确认你的vim版本支持clipboard特性: 输入shell命令查看是否支持,如果支持,输出的clipboard前面为+号:vim --version | grep clipboard +cli ...

  2. Linux下Java剪贴板的访问

    1 概述 本文主要讲述了如何利用xsel在Linux环境下对系统剪贴板的访问. 2 起因 在搜索引擎直接搜索"Java访问剪贴板",大部分都是直接使用AWT API进行访问的例子: ...

  3. win10 UWP 剪贴板 Clipboard

    本文告诉大家如何使用剪贴板 Clipboard 读取剪贴板和放内容在剪贴板 在 win10 UWP 可以通过 Windows.ApplicationModel.DataTransfer.Clipboa ...

  4. Xamarin Essentials教程剪贴板Clipboard

    Xamarin Essentials教程剪贴板Clipboard 现在手机设备操作以触屏为主,不便于文本输入.虽然可以通过复制/粘贴的方式,借助系统剪贴板简化操作,但仍然不够方便.如果通过代码操作剪贴 ...

  5. python和sqlserver应用_Windows和Linux下使用Python访问SqlServer的方法介绍

    经常用Python写demo来验证方案的可行性,最近遇到了Python访问SqlServer的问题,这里总结下. 一.Windows下配置Python访问Sqlserver 环境:Windows 7 ...

  6. linux indent命令: 调整C原始代码文件的格式

    linux indent命令: 调整C原始代码文件的格式 介绍: indent命令可辨识C的原始代码文件,并加以格式化,以方便程序员阅读. 语法: indent [参数][源文件] indent [参 ...

  7. html代码范例_最佳HTML范例和HTML5范例

    html代码范例 HTML provides the structure of websites. Here are some examples of how to use HTML syntax t ...

  8. c++访问数据库代码示例 occi_使用Python操作SQL Server数据库

    先说一下SQL Server 如果有条件可以使用远程连接或者TeamViewer等工具,操作带GUI的数据库管理器,实施起来可以很省心.可以直接查看结果,模板化查询甚至提示语句错误等. 如果是使用li ...

  9. VB6监视/操作剪贴板示例(VB6.0代码)

    剪贴板的监视,需要先使用SetClipboardViewer设置某个句柄为剪贴板查看器的一员. 然后当剪贴板发生改变时,系统就会向这个句柄发送WM_DRAWCLIPBOARD消息. 只要使用子类化拦截 ...

  10. linux开放外部端口访问

    前言 linux安装相关软件可能都需要允许外网访问,例如mysql.redis.kafka等,前些天一同事安装了mosquitto(Mqtt服务器),外网却无法访问,检查相关配置外还是不能访问.关于这 ...

最新文章

  1. c php socket,C与php socket通讯
  2. php 做的网页 排版错误,discuz 帖子排版显示出错
  3. 【Android 逆向】Android 进程注入工具开发 ( 调试进程中寄存器的作用 | 通过 EIP 寄存器控制程序运行 | EIP 寄存器的存档与恢复 )
  4. 按时间片轮转调度算法(C++实现)
  5. OpenCASCADE:Foundation Classes之数学原语和算法
  6. Master DNS服务的搭建
  7. 计算机网络第三章知识网络,计算机基础教案第三章计算机网络基础知识教案
  8. java私有表示标识_java里面的标识符、关键字和类型
  9. 网际风全推数据接口_智能风控系统设计与实践
  10. MPLS virtual private network OptionB实验(华为设备)
  11. 跟小静读CLR via C#(15)--String,熟悉而又陌生
  12. python3 字符串编解码和UnicodeDecodeError
  13. 安装多个不同版本chrome浏览器
  14. 春晚红包:史上最难开卷考试,快手交卷了
  15. linux vi替换字符串
  16. lcx 通过端口转发实现内网穿透
  17. 【读书】《禅与摩托车维修艺术》读后感
  18. UML一篇文章就学通!
  19. 人生本来极短,像流星刬过天空一样
  20. 电影:《从你的全世界路过》影评摘抄

热门文章

  1. Java vbnullstring_VB中Null、Empty、Nothing及vbNullString的区别
  2. 用户环境变量_linux 初级3 环境变量命令env、set、export、declare的区别
  3. react根据中文获取拼音_学前家长建议收藏:你要的「趣味拼音课」来了
  4. python turtle画房子详细解释_Python turtle 绘图入门必知必会
  5. 怎么用python画风车_小清新风车短教程:10步教你绘制一副插画
  6. 首届全国大学生工程训练综合能力竞赛圆满落幕
  7. 聊聊flink JobManager的heap大小设置 1
  8. JMS系列(三)-java操作JMS Topic实例
  9. WPF中自定义MarkupExtension
  10. Python全栈之路系列之列表数据类型