linux C语言获取鼠标的绝对坐标/位置

本文开发环境配置:

依赖的库/文件deb系rpm系
gdk-2.0apt install libgtk2.0-devyum install gtk2-devel
gdk-3.0apt install libgtk-3-devyum install gtk3-devel
x11/Xlib.hapt install libx11-devyum install libX11-devel
X11/extensions/XTest.hapt install libxtst-devyum install libXtst-devel
  • 本文中使用的gdk代码在编译时如果提示’undefined reference’,则表示您的系统中gtk2 / gtk3的版本已经将该API丢弃,此时建议您自己再查阅/usr/include/gtk-2.0/gdk/usr/include/gtk-3.0/gdk下相关的头文件。

1、gtk/gdk 2.0获取linux下鼠标的全局坐标

//返回参数得到的是鼠标的横纵坐标
void getMousePosition(int *mouseX,int *mouseY){
	GdkDisplay  *display;
    GdkScreen   *screen;
    GdkWindow   *window;
	gdk_init(NULL,NULL);//gdk代码必须使用该函数初始化gdk环境
    display = gdk_display_get_default();//获取默认的GdkDisplay
    screen = gdk_display_get_default_screen(display);//获取默认GdkDisplay对应的默认GdkScreen
    window = gdk_screen_get_root_window(screen);//获取GdkScreen对应的GdkWindow
    gdk_window_get_pointer(window,mouseX,mouseY,0);//根据全局GdkWindow获取鼠标位置
}

2、gtk/gdk 3.0获取linux下鼠标的全局坐标

//参数分别是mouse的横纵坐标
void getMousePosition(int *mouseX,int *mouseY){
    GdkDisplay* ddpy;
    GdkDeviceManager* device_manager;
    GdkDevice* pointer;
    
    gdk_init(NULL,NULL);//使用gdk时必须要gdk_init()
    ddpy = gdk_display_get_default();   //获取默认的GdkDisplay
    device_manager = gdk_display_get_device_manager(ddpy);//获取gdk设备管理器
    pointer = gdk_device_manager_get_client_pointer(device_manager);//获取gdk表示的鼠标设备

    gdk_device_get_position(pointer,NULL,mouseX,mouseY);//获取鼠标设备的全局坐标
}

3、x11/xlib 获取linux全局鼠标位置

void getMousePosition(int* mouseX,int* mouseY){
    Display* dpy;
    XEvent e;

    dpy = XOpenDisplay(NULL);/*获取默认的x11 Display*/
    //关注全局鼠标点击事件,注意该函数必须调用,否则XNextEvent()无法捕获到鼠标点击事件
    XGrabPointer(dpy,
                 DefaultRootWindow(dpy),
                 1,
                 PointerMotionMask | ButtonPressMask | ButtonReleaseMask ,/*依次表示鼠标的移动、按下、抬起事件掩码*/
                 GrabModeAsync,
                 GrabModeAsync,
                 None,
                 None,
                 CurrentTime);/*CurrentTime == 0,是宏定义*/

    while(1){
        //使用如下事件模拟鼠标点击事件
        XTestFakeButtonEvent(dpy,1,1,CurrentTime);//鼠标按下Press
        XTestFakeButtonEvent(dpy,1,0,CurrentTime);//鼠标抬起Release

        //XNextEvent()会阻塞等待事件产生
        XNextEvent(dpy,&e);
        if(e.type == ButtonPress){/*监测到鼠标点击事件*/
            *mouseX = e.xmotion.x_root;
            *mouseY = e.xmotion.y_root;
            break;/*监测到点击后,记录鼠标坐标,便立即退出while循环*/
        }
    }

    XCloseDisplay(dpy);/*关闭x11 Display*/
}

4、代码测试

  1. gtk/gdk代码测试(2.0 与3.0测试代码通用,只是getMousePosition()内部不同)
#include <stdio.h>
#include <gdk/gdk.h>
#include <unistd.h>

void getMousePosition(int *mouseX,int *mouseY);

int main(int argc,char* argv[]){
    int mouseX,mouseY;
    getMousePosition(&mouseX,&mouseY);
    printf("x=%d y=%d\n",mouseX,mouseY);
    return 0;
}

gtk-2.0 编译: gcc mouse-20.c -o mouse-20 `pkg-config --cflags --libs gtk+-2.0`
gtk-3.0 编译:gcc mouse-30.c -o mouse-30 `pkg-config --cflags --libs gtk+-3.0`

2)x11代码测试

/* 使用XTestFakeButtonEvent()模拟鼠标点击事件
 * 激活XNextEvent(),捕获到鼠标点击事件后打印鼠标的位置
 */
#include <X11/Xlib.h>
#include <X11/extensions/XTest.h>
#include <stdio.h>

void getMousePosition(int* mouseX,int* mouseY);

int main(){
    int x,y;
    getMousePosition(&x,&y);
    printf("x=%d y=%d\n",x,y);
    return 0;
}
编译: gcc test.c -o test `pkg-config --cflags --libs x11 xtst`
或者: gcc test.c -o test -lX11 -lXtst
  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值