Здравствуйте.
Скачал исходник программы evtest, которая демонстрирует глобальный перехват клавиатуры и мыши, и добавил в нее свой код.
static int print_events(int fd)
{
struct input_event ev[64];
int i, rd;
while (1) {
rd = read(fd, ev, sizeof(struct input_event) * 64);
if (rd < (int) sizeof(struct input_event)) {
printf("expected %d bytes, got %d\n", (int) sizeof(struct input_event), rd);
perror("\nevtest: error reading");
return 1;
}
for (i = 0; i < rd / sizeof(struct input_event); i++) {
printf("Event: time %ld.%06ld, ", ev[i].time.tv_sec, ev[i].time.tv_usec);
if (ev[i].type == EV_SYN) {
if (ev[i].code == SYN_MT_REPORT)
printf("++++++++++++++ %s ++++++++++++\n", syns[ev[i].code]);
else
printf("-------------- %s --qqqqqq----------\n", syns[ev[i].code]);
} else {
printf("type %d (%s), code %d (%s), ",
ev[i].type,
events[ev[i].type] ? events[ev[i].type] : "?",
ev[i].code,
names[ev[i].type] ? (names[ev[i].type][ev[i].code] ? names[ev[i].type][ev[i].code] : "?") : "?");
if (ev[i].type == EV_MSC && (ev[i].code == MSC_RAW || ev[i].code == MSC_SCAN))
printf("vay7 y yylue %02x\n", ev[i].value);
else {
printf("value %d\n", ev[i].value);}
if (ev[i].value==1)
if (ev[i].code==97){
if (nn==0){
nn = 1;
printf("press\n");
Display *d;
Window root;
d = XOpenDisplay(NULL);
if (d!=NULL){
printf("d != null\n");
assert(d);
root = DefaultRootWindow(d);
XEvent event;
memset(&event, 0x00, sizeof(event));
event.type = ButtonPress;
event.xbutton.button = Button1;
event.xbutton.same_screen = True;
event.xbutton.subwindow = event.xbutton.window;
while(event.xbutton.subwindow) {
XQueryPointer(d, RootWindow(d, DefaultScreen(d)), &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.window = event.xbutton.subwindow;
XQueryPointer(d, 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);
}
XSendEvent(d, PointerWindow, True, 0xfff, &event);
XCloseDisplay(d);
}
}
} else // code<>97
if (nn==1){
nn = 0;
printf("release\n");
Display *d;
Window root;
d = XOpenDisplay(NULL);
if (d!=NULL) {
printf("d != null\n");
assert(d);
root = DefaultRootWindow(d);
XEvent event;
memset(&event, 0x00, sizeof(event));
event.type = ButtonRelease;
event.xbutton.button = Button1;
event.xbutton.same_screen = True;
event.xbutton.subwindow = event.xbutton.window;
while (event.xbutton.subwindow) {
XQueryPointer(d, RootWindow(d, DefaultScreen(d)), &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.window = event.xbutton.subwindow;
XQueryPointer(d, 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);
}
XSendEvent(d, PointerWindow, True, 0xfff, &event);
XCloseDisplay(d);
}
}
}
}
}
}
Собираю так: gcc -o ev evtest.c -lX11
При запуске программы, выбираю опцию перехвата клавиатуры.
При нажатии на клавишу RIGHT_CONTROL левая кнопка мыши должна залипнуть. А при нажатии любой другой клавиши - отлипнуть. Но этого не происходит!
Помогите выяснить, почему.
Нашел ошибку! Всё работает!
Тему можно удалить.
Да наоборот - поделились бы опытом с потомками =)
while (event.xbutton.subwindow) {
XQueryPointer(d, RootWindow(d, DefaultScreen(d)), &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.window = event.xbutton.subwindow;
//XQueryPointer(d, 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); //Лишняя строчка
}
Откуда-то взялась лишняя строчка. Без нее работает.
Отправить комментарий