Как мы имитируем щелчок мыши с помощью Xlib/C?

Я хочу найти код C/Xorg, чтобы «ввести» щелчок левой кнопкой мыши. Я бы ожидал одну строку кода, но единственные вещи, которые я нашел написанными на C, имеют длину около двух десятков строк, и они все равно не работают :( Кажется, это можно сделать в Windows, но я в Linux .

Причина вопроса в том, что я написал утилиту, которая позволяет мне перемещать указатель мыши между несколькими экранами с помощью клавиатуры. Единственная проблема заключается в том, что если я перемещаюсь в место, где раньше было окно abc, но другое окно xyz было загружено поверх того же места, указатель мыши перемещается на xyz просто отлично, но xyz не имеет фокуса - до тех пор, пока Я щелкнул левой кнопкой мыши. Итак, я хочу встроить «щелчок» в свой код.

Код, который я пробовал, не работал, был основан на XSendEvent().


person Ray Andrews    schedule 07.01.2012    source источник
comment
+1 за указание причины, по которой вы хотите это сделать.   -  person R.. GitHub STOP HELPING ICE    schedule 07.01.2012
comment
если вы не хотите тянуться к мыши, вам следует подумать об использовании оконного менеджера, который поддерживает такие вещи. Я могу порекомендовать xmonad, но есть и другие.   -  person johannes_lalala    schedule 16.01.2016


Ответы (3)


Да, я более-менее разобрался. Во всяком случае, кажется, что это так:

{
#include <X11/extensions/XTest.h>
XTestFakeButtonEvent(display, 1, True, CurrentTime);
XTestFakeButtonEvent(display, 1, False, CurrentTime);
XFlush(display);
}

... и добавьте "-lXtst" в строку LDFLAGS в Makefile.

Xlib кажется чертовски сложным. У меня был совет использовать другие библиотеки, мне жаль, что я не знал, как перейти к переходу.

Спасибо Р.

person Ray Andrews    schedule 08.01.2012

Почему бы просто не поднять/не сфокусировать окно, а не пытаться создать фальшивое событие клика? Это должно быть намного надежнее и работать со всеми оконными менеджерами, даже без щелчка для фокусировки.

person R.. GitHub STOP HELPING ICE    schedule 07.01.2012
comment
Р: Весь смысл упражнения в том, чтобы иметь возможность перемещаться между экранами без помощи других. приходится прикасаться к мыши, поэтому, если я могу перемещать указатель с помощью KB, но все равно должен тянуться к мыши, чтобы щелкнуть левой кнопкой мыши, тогда все это становится немного бессмысленным. Конечно, при перемещении между окнами на одном экране нет проблем, но при попытке перейти с одного экрана на другой я не могу найти встроенного ярлыка. - person Ray Andrews; 07.01.2012
comment
Переместите указатель мыши, как вы это делаете, но затем отправьте подъем/фокус, а не щелчок. - person R.. GitHub STOP HELPING ICE; 08.01.2012
comment
Хорошая идея! Кажется, Alt+Esc делает это. Теперь мне просто нужно узнать, как отправить это. - person Ray Andrews; 08.01.2012
comment
С помощью bindkey \e^[ идентифицирует Alt+Esc, теперь, чтобы перевести это во что-то, что C может понять... - person Ray Andrews; 08.01.2012
comment
Нет, не отправлять ключевое событие. Это фальшивый хак, специфичный для одного оконного менеджера. Вместо этого, после использования вызовов Xlib для изменения положения указателя мыши, используйте Xlib для определения окна под указателем мыши и поднимите/сфокусируйте его с помощью Xlib. Нет причин когда-либо генерировать поддельные события для того, что вы пытаетесь сделать. - person R.. GitHub STOP HELPING ICE; 08.01.2012

xdotool - это простой способ сделать это. Это инструмент командной строки. Вы можете использовать его в простых сценариях. Например:

#!/bin/sh
xdotool mousemove x y
xdotool click 1
person johannes_lalala    schedule 16.01.2016
comment
Спасибо, это интересная программа, она выглядит лучше, чем моя «movemouse», хотя моя, возможно, лучше подходит для простого перемещения мыши. - person Ray Andrews; 17.01.2016