一些键盘/鼠标事件无法捕获-xlib编程
我对这个程序有疑问。它列出了系统上运行的当前窗口及其窗口 ID。
结果是,对于我输入的特定窗口 ID,我得到了一个奇怪的结果: 对于 Firefox 或 gedit 等应用程序,只有运动通知事件起作用,其他事件不起作用。
对于我的终端(bash),一切正常:按键、释放键、鼠标通知、释放鼠标……
为什么会这样?
Display * dis;
Window w;
dis = XOpenDisplay (0);
w=XDefaultRootWindow(dis);
Atom a = XInternAtom(dis, "_NET_CLIENT_LIST" , 1);
Atom actualType;
int format;
unsigned long numItems, bytesAfter;
unsigned char *data =0;
int status = XGetWindowProperty(dis,
w,
a,
0L,
(~0L),
0,
AnyPropertyType,
&actualType,
&format,
&numItems,
&bytesAfter,
&data);
if (status >= Success && numItems)
{
int *array = (int*) data;
int k;
for (k = 0; k < numItems; k++)
{
// get window Id:
Window w = (Window) array[k];
char* name = '\0';
status = XFetchName(dis, w, &name);
if (status >= Success)
{
XSelectInput (dis, wev, KeyPressMask |PointerMotionMask |ButtonReleaseMask);
printf("Found: %u %s\n", w, name);
}
XFree(name);
}
XFree(data);
}
XEvent event;
while (1) {
XNextEvent(dis, &event);
switch (event.type) {
//MOUSE LOCATION
case MotionNotify:
fprintf(stdout,"x: %d y:%d\n",event.xmotion.x,event.xmotion.y);
break;
//--------------------------------
//KEYBOARD KEY(it does not wok)
case KeyPress:
fprintf(stdout,"key: %d \n",event.xkey.keycode);
break;
//--------------------------------
//KEYBOARD KEY(it does not wok)
case KeyRelease:
fprintf(stdout,"key: %d \n",event.xkey.keycode);
break;
//--------------------------------
case ButtonRelease:
//show which button is released
if (event.xbutton.button==1)
fprintf(stdout,"mouse left click");
if (event.xbutton.button==2)
fprintf(stdout,"middle left click");
if (event.xbutton.button==3)
fprintf(stdout,"mouse right click");
break;
}
}
I have a problem with this program. It lists the current windows along with their window IDs, that are running on the system.
Result is that for a particular window ID that i entered, I got an odd result:
for applications like firefox or gedit, just the motion notify event works, non of the other events work.
For my terminal (bash), everything works: key press, key release, mouse notify, mouse release, ...
Why is this the case?
Display * dis;
Window w;
dis = XOpenDisplay (0);
w=XDefaultRootWindow(dis);
Atom a = XInternAtom(dis, "_NET_CLIENT_LIST" , 1);
Atom actualType;
int format;
unsigned long numItems, bytesAfter;
unsigned char *data =0;
int status = XGetWindowProperty(dis,
w,
a,
0L,
(~0L),
0,
AnyPropertyType,
&actualType,
&format,
&numItems,
&bytesAfter,
&data);
if (status >= Success && numItems)
{
int *array = (int*) data;
int k;
for (k = 0; k < numItems; k++)
{
// get window Id:
Window w = (Window) array[k];
char* name = '\0';
status = XFetchName(dis, w, &name);
if (status >= Success)
{
XSelectInput (dis, wev, KeyPressMask |PointerMotionMask |ButtonReleaseMask);
printf("Found: %u %s\n", w, name);
}
XFree(name);
}
XFree(data);
}
XEvent event;
while (1) {
XNextEvent(dis, &event);
switch (event.type) {
//MOUSE LOCATION
case MotionNotify:
fprintf(stdout,"x: %d y:%d\n",event.xmotion.x,event.xmotion.y);
break;
//--------------------------------
//KEYBOARD KEY(it does not wok)
case KeyPress:
fprintf(stdout,"key: %d \n",event.xkey.keycode);
break;
//--------------------------------
//KEYBOARD KEY(it does not wok)
case KeyRelease:
fprintf(stdout,"key: %d \n",event.xkey.keycode);
break;
//--------------------------------
case ButtonRelease:
//show which button is released
if (event.xbutton.button==1)
fprintf(stdout,"mouse left click");
if (event.xbutton.button==2)
fprintf(stdout,"middle left click");
if (event.xbutton.button==3)
fprintf(stdout,"mouse right click");
break;
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论