【发布时间】:2017-03-07 08:51:05
【问题描述】:
我在 Ubuntu 16.10 的两台显示器上运行两个全屏应用程序。 app1 需要指针,而且必须始终保持焦点,所以我需要将指针锁定在 app1 中。
我写了一个这样的工具来抓取指针:
#include <stdio.h>
#include <X11/Xlib.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
Display *display;
XEvent xevent;
Window window;
int x,y;
void setPos(int x,int y){
XWarpPointer(display,None,window,0,0,0,0,x,y);
XFlush(display);
}
int main(int argc, char **argv){
if( (display = XOpenDisplay(NULL)) == NULL )
return -1;
window = DefaultRootWindow(display);
XAllowEvents(display, AsyncBoth, CurrentTime);
XGrabPointer(display,window,0,PointerMotionMask,GrabModeAsync,GrabModeAsync,None,None,CurrentTime);
while(1) {
XNextEvent(display, &xevent);
switch (xevent.type) {
case MotionNotify:
if(xevent.xmotion.x_root>1920){
setPos(1920,xevent.xmotion.y_root);
}
break;
}
}
return 0;
}
这个工具可以捕获指针的事件并限制指针停留在app1中,但是指针不能在app1中进行任何操作。除运动外的所有指针事件均无效。对代码有什么建议吗?或者有什么其他的想法来完成这项工作?
【问题讨论】:
-
查看
SendEvent()将事件发回。您可能需要实际查找目标窗口。我对 X11 太生疏了,无法发布实际代码,但这应该是一个很好的线索。另外,请阅读该手册的索引,它有很好的章节标题(在本例中为“向其他应用程序发送事件”)。 -
我用了这个方法,没用,什么都没变。 XSendEvent(display,PointerWindow,True,ButtonPressMask,&xevent);指针点击的窗口未激活,我运行该工具的终端一直处于活动状态。
标签: c linux pointers xlib xgrabpointer