100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > linux C语言获取鼠标的绝对坐标/位置

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

时间:2023-07-21 15:33:51

相关推荐

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

本文开发环境配置:

本文中使用的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();//获取默认的GdkDisplayscreen = gdk_display_get_default_screen(display);//获取默认GdkDisplay对应的默认GdkScreenwindow = gdk_screen_get_root_window(screen);//获取GdkScreen对应的GdkWindowgdk_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(); //获取默认的GdkDisplaydevice_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);//鼠标按下PressXTestFakeButtonEvent(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、代码测试

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。