X11是一个用于位图显示的可扩展窗口系统。它构成了大多数Unix操作系统GUI的基础。
是否可以使用工具跟踪XWindow协议?我认为wireshark将是一个很好的框架来承载这样的想法,但似乎没有支持。为了实现这个目标应该做什么?
我正在尝试使用 xcb_shm_get_image_unchecked 抓取窗口部分的屏幕截图。我使用以下代码创建了共享内存: #包括 #包括 我正在尝试使用 xcb_shm_get_image_unchecked 抓取窗口部分的屏幕截图。我使用以下代码创建了共享内存: #include <cstdlib> #include <memory> #include <sys/shm.h> #include <xcb/shm.h> #include <xcb/xcb.h> #include <xcb/xcb_image.h> #include <xcb/xcb_pixel.h> #include <xcb/xproto.h> #include <spdlog/spdlog.h> const auto IMAGE_WIDTH = 640; const auto IMAGE_HEIGHT = 480; const auto SHM_SIZE = 4 * 1024 * 1024; auto main() -> int { std::unique_ptr<xcb_connection_t, decltype(&xcb_disconnect)> c( xcb_connect(nullptr, nullptr), &xcb_disconnect); if (!c) { spdlog::error("failed to connect to X server"); return EXIT_FAILURE; } auto roots_iter = xcb_setup_roots_iterator(xcb_get_setup(c.get())); if (roots_iter.rem == 0) { spdlog::error("no screen found"); return EXIT_FAILURE; } auto root = roots_iter.data->root; xcb_shm_seg_t shmseg = xcb_generate_id(c.get()); // xcb_shm_get_im auto shm_reply = xcb_shm_create_segment_reply( c.get(), xcb_shm_create_segment(c.get(), shmseg, SHM_SIZE, 0), nullptr); if (!shm_reply) { spdlog::error("failed to create shared memory segment"); return EXIT_FAILURE; } auto fds = xcb_shm_create_segment_reply_fds(c.get(), shm_reply); spdlog::info("found {} fds", shm_reply->nfd); for (int i = 0; i < shm_reply->nfd; i++) { auto err = xcb_request_check( c.get(), xcb_shm_attach_fd(c.get(), shmseg, fds[i], true)); if (err) { spdlog::error("failed to attach fd: {}", fds[i]); delete err; } } for (int i = 0; i < shm_reply->nfd; i++) { close(fds[i]); } xcb_shm_detach(c.get(), shmseg); return 0; } 第一个问题:在释放资源方面我做得对吗? 第二:如何访问共享内存段? 最后,我如何抓取根窗口的 640x480 屏幕截图?我是否走在正确的道路上: auto image = xcb_shm_get_image_reply( c.get(), xcb_shm_get_image_unchecked(c.get(), root, 0, 0, IMAGE_WIDTH, IMAGE_HEIGHT, XCB_GC_PLANE_MASK, XCB_IMAGE_FORMAT_Z_PIXMAP, shmseg, 0), nullptr); if (!image) { spdlog::error("failed to get image"); xcb_shm_detach(c.get(), shmseg); return EXIT_FAILURE; } spdlog::info("image: size {}", image->size); delete image; 您必须调用 mmap 才能访问共享内存。来自 xcb_shm_create_segment_unchecked 的文档: 要求服务器分配共享内存段。服务器的回复将包含一个文件描述符,供客户端传递给 mmap()。 如何获得访问权限? 您必须调用 mmap(包括文件描述符)来告诉 mmap 在哪里找到由 X 服务器分配的内存区域。 你可以使用这样的东西来做到这一点: auto *shmem = mmap(nullptr, SHM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fds[0], 0); if (shmem == MAP_FAILED) { ... // cleanup } close(fds[0]); 一旦您阅读了 mmap 的文档,这些论点应该是不言自明的。最后一个 0 只是意味着我们希望指针指向内存区域的开头。 当然,完成后别忘了munmap: munmap(p, SHM_SIZE); 最后,不需要xcb_shm_attach_fd(c.get(), shmseg, fds[i], true));。仅当您自己创建 mmap 文件并将其传递到 X 服务器以便它可以访问时才需要这样做。 第一个问题:在释放资源方面我做得对吗? 是的,你有 如何抓取根窗口的 640x480 屏幕截图? 您用于抓取图像的代码几乎是正确的。只需将 plane_mask 参数更改为 ~0 即可。要实际将字节转换为图像,您可以选择将其转换为最小公分母图像格式,例如 PPM。该代码如下所示: if (auto f = std::ofstream("/path/to/screenshot.ppm", std::ios::binary); f) { f << "P6\n" << IMAGE_WIDTH << " " << IMAGE_HEIGHT << "\n255\n"; const auto *const imageData = shmem; for (uint32_t rgb = 0; rgb + 4 <= image->size; rgb += 4) { auto b = imageData[rgb]; auto g = imageData[rgb + 1]; auto r = imageData[rgb + 2]; if (setup->image_byte_order == XCB_IMAGE_ORDER_MSB_FIRST) { std::swap(b, r); } f << r << g << b; } } 最终结果应该是位于 ppm 的 /path/to/screenshot.ppm 格式的图像。如果你没有办法查看它,imagemagick能够将ppm转换为png,这样你就可以这样查看。
这可能吗? 我使用的是OpenGL版本 imgui 的一件事真的让我很恼火, 我似乎找不到为 imgui 创建最大化窗口的方法。 如果(!glfwInit()) ... GLFW...
我读到MWM过去有WSM,并且包含在2.3.8源代码的demos/programs文件夹中。 但是,有一条注释指出支持的功能是远程...
如何在 ssh 客户端而不是 ssh 服务器上显示 python/openCV 结果图像?
我使用 ssh -Y username@adress 连接到 ssh 服务器。 在服务器上我使用 IDLE 运行 python2.7。 如果我使用 matplotlib,我可以在客户端上看到结果图。这表明图形化的前进......
在 Fedora 39 中,使用 i3 + urxvt + tmux,每次我 tmux new-session 或 tmux Attach-session 时,都会将以下字符打印到终端 shell,大概是损坏或误解的......
一些opencv代码在执行时需要显示GUI窗口。相反,它显示 Gtk-WARNING **:xxx:无法打开显示:。它发生在网络和桌面应用程序中。可以用som吗...
禁用/抑制 R 中 CRAN 镜像选择的 tcltk 弹出窗口
我的问题与之前发布的问题类似,但从未真正在这里得到解答: 在 R 中禁用 GUI、图形设备 我不喜欢用于 CRAN 镜像选择的 R tcltk 弹出窗口。他们也流行...
使用:Linux Mint 13 (Maya) 64 Cinnamon 2.0.14,wmctrl v.1.07 由于身体残疾,我希望能够使用键盘移动窗口和调整窗口大小,但调整大小和移动跳转到 b...
如何使用 python/paramiko 通过 SSH 在服务器 (Raspi) 上打开 GUI 应用程序?
作为服务器,我有一个 Raspberry Pi,其显示器通过 hdmi 连接。在我的 Windows 10 电脑上,我想通过 ssh 在我的 Pi 上执行 gui 应用程序,以便该应用程序显示在 Pi 的显示器上...
如何在 Windows 10 上设置 VcXSrv.exe 以在不禁用访问控制的情况下使用 WSL2?互联网上的每个描述都显示禁用访问控制,但这允许
我的目标是使用 Java 库在 X11 窗口上绘画。问题是我想在一个已经存在的窗口上执行此操作,并且我知道它的窗口 ID。我已经用 C 和 Rust 完成了这个,但是......
如何在远程服务器上的 Docker 容器内运行代码 GUI?
我已经在Linux服务器上创建了一个Docker容器。我使用 VSCode 从笔记本电脑连接到此容器,并且可以运行一些代码。但是,我无法运行某些需要 GUI 的程序,...
xTerm 如何与包含它的 XWindows 会话进行通信?
我想在 Linux (openSUSE 12.3) 和 XWindows 下编写在 kiosk 模式下打开 chromium 的脚本,同时控制 chromium 出现在哪个监视器中。我还需要让这个脚本在工作站之外运行...
我通过 SSH 从我的 Linux 计算机连接到 Solaris (10) 服务器。 但是,当我尝试使用“ xterm”打开另一个终端时,它不起作用。 我将 DISPLAY 环境变量设置为 12...
在脚本中,我有一个针对 N 个测试的循环,它在每个测试的 xterm 窗口中运行一个命令。 N可以是30。 当 N = 16 时,我注意到我只有 11 个 xterm 窗口来创建前 11 个测试......
有没有办法将 BufferedImage 转换为 X11 Pixmap?看起来 JNA 有 com.sun.jna.platform.unix.X11.Pixmap 但我找不到将任何内容转换为该格式的方法。
有没有办法用C在Linux中模拟按键? 在我的具体情况下,我使用的是 Ubuntu 9.04,需要一个简单的应用程序,在启动时调用“暂停”按钮。那会...
我最近了解到了 Xephyr 这个工具,并且想知道是否可以在 QT 小部件中使用它。我设想的是一个嵌入式 Xephyr,或者任何 X11 服务器,在一个小实例中运行
我正在尝试在 Windows 10 中使用 netbeans 远程访问我的树莓派,但有一个像下图这样的报告。我收到以下错误,我不明白。我看到一些 X11 DIS...