当前位置: 首页 > 面试题库 >

Linux,如何捕获屏幕并模拟鼠标移动

盖昀
2023-03-14
问题内容

我需要以某种方式捕获屏幕(作为打印屏幕),以便可以访问像素颜色数据,以进行一些图像识别,此后,我将需要在屏幕上生成鼠标事件,例如左键单击,拖放(移动鼠标)同时按下按钮,然后释放它)。完成后,图像将被删除。

注意:我需要捕获整个屏幕,用户可以看到所有内容,并且需要模拟程序窗口外的点击(如果有任何不同)

规格:Linux ubuntu语言:C ++

性能不是很重要,“打印屏幕”功能将每隔10秒执行一次。该过程的持续时间最多可为24小时,因此方法必须稳定且内存泄漏无泄漏(通常:)

我能够在Windows中使用win GDI和一些Windows事件来执行操作,但是我不知道如何在Linux中执行操作。

非常感谢


问题答案:
//sg

//Solution using Xlib for those who use Linux
#include <X11/Xlib.h>
#include<stdio.h>
#include<unistd.h>
#include <stdlib.h>
#include <string.h>

#include <unistd.h>

#include <X11/Xlib.h>
#include <X11/Xutil.h>

void mouseClick(int button)
{
    Display *display = XOpenDisplay(NULL);

    XEvent event;

    if(display == NULL)
    {
        fprintf(stderr, "Cannot initialize the display\n");
        exit(EXIT_FAILURE);
    }

    memset(&event, 0x00, sizeof(event));

    event.type = ButtonPress;
    event.xbutton.button = button;
    event.xbutton.same_screen = True;

    XQueryPointer(display, RootWindow(display, DefaultScreen(display)), &event.xbutton.root, &event.xbutton.window, &event.xbutton.x_root, &event.xbutton.y_root, &event.xbutton.x, &event.xbutton.y, &event.xbutton.state);

    event.xbutton.subwindow = event.xbutton.window;

    while(event.xbutton.subwindow)
    {
        event.xbutton.window = event.xbutton.subwindow;

        XQueryPointer(display, event.xbutton.window, &event.xbutton.root, &event.xbutton.subwindow, &event.xbutton.x_root, &event.xbutton.y_root, &event.xbutton.x, &event.xbutton.y, &event.xbutton.state);
    }

    if(XSendEvent(display, PointerWindow, True, 0xfff, &event) == 0) fprintf(stderr, "Error\n");

    XFlush(display);

    usleep(100000);

    event.type = ButtonRelease;
    event.xbutton.state = 0x100;

    if(XSendEvent(display, PointerWindow, True, 0xfff, &event) == 0) fprintf(stderr, "Error\n");

    XFlush(display);

    XCloseDisplay(display);
}
int main(int argc,char * argv[]) {

    int x , y;
    x=atoi(argv[1]);
    y=atoi(argv[2]);
    Display *display = XOpenDisplay(0);

    Window root = DefaultRootWindow(display);
    XWarpPointer(display, None, root, 0, 0, 0, 0, x, y);
    mouseClick(Button1);
    XFlush(display);
    XCloseDisplay(display);
    return 0;
}

进行构建,然后模拟x的点击,y做:

$ ./a.out x y

$ g ++ -lX11 sgmousesim2.cpp

$ ./a.out 123 13

以防万一您仍然感兴趣。



 类似资料:
  • 问题内容: 如何在Java中使用鼠标指针捕获屏幕图像?我知道可以使用Robot类捕获屏幕,但是它可以捕获没有鼠标指针的屏幕,因此这不是我的解决方案。 问题答案: 这不是直接可能的,但是您可以用来获取指针当前所在的位置的信息。 将屏幕截图作为后,您可以在Java 2D API的帮助下将您自己的光标图像确切地放置在屏幕截图上的该位置。

  • 问题内容: 我敢肯定这是可能的,但是我所有的搜索都空白了。 在Java中,是否可以在Java应用程序之外注册鼠标移动事件?因此,如果鼠标指针移动到屏幕上的任何地方,我都会回电。轮询可能是近似值,但必须有更好的方法。 谢谢 解释用例:它仅用于一个宠物项目,但是基本上是当鼠标击中屏幕边缘时触发事件。我还认为,如果您尝试 超越 屏幕边缘,可能会触发其他事件。为此,我认为鼠标运动侦听器可能更合适。 问题答

  • 我试图根据用户输入的坐标捕捉区域截图。基本上,用户在屏幕上点击得到x,y坐标,然后在其他地方点击另一对x,y坐标,然后将其放入一个矩形中,并使用机器人库创建屏幕截图。 我有的问题是,我得到了随机截图,这不是用户输入的坐标,我怎么能考虑包括0的坐标,因为矩形值必须超过1。 以下是我迄今为止的代码:

  • 问题内容: 我正在尝试模拟鼠标在窗口上的单击。我目前已经成功完成了以下操作(我正在使用Python,但是它应该适用于一般的win32): 这很好。但是,如果在我手动移动鼠标时发生单击,则光标位置会被抛出。有什么方法可以将点击直接发送到给定的坐标而无需将鼠标移动到那里?我尝试了以下类似的方法,但运气并不好: 问题答案: 尝试WindowFromPoint()函数:

  • 问题内容: 如何使用快照数据捕获android设备屏幕内容并制作图像文件?我应该使用哪个API或在哪里可以找到相关资源? 顺便说一句:不是相机快照,而是设备屏幕 问题答案: 根据此链接 ,可以在android sdk的tools目录中使用ddms进行屏幕截图。 要在应用程序内(而不是在开发过程中)执行此操作,也有一些应用程序可以这样做。但是正如@ zed_0xff指出的那样,它肯定需要root用户

  • 问题内容: 我尝试在Linux中控制鼠标。Xlib似乎可以工作,但是当我尝试将其与OpenCV一起使用时,它会不断返回: 所以我决定写“ / dev / psaux”。代码如下: 用以下命令编译: 运行并获得 但是鼠标不会移动。然后,我打开一个新终端,输入“ sudo cat / dev / psaux”并运行“ my_psaux”。但是我什么都没有。 什么都没有写到“ / dev / psaux