Russian Qt Forum

Компиляторы и платформы => Linux => Тема начата: west от Февраль 24, 2008, 17:30



Название: Имитация мышки
Отправлено: west от Февраль 24, 2008, 17:30
Надо сделать програмку по имитации работы мышки, т.е. управлять ей с клавы, по сети, с файла - все равно. Что касается ее позиционирования - все понятно, как сделать "клик", и даже "дабл клик" - чего-то вообще не ясно. Есть идеи? Клик должен быть полноценный  :-\, с сохранением всех последствий и эффектов.


Название: Re: Имитация мышки
Отправлено: SiRuS от Февраль 26, 2008, 10:11
Делал через events из XLib. Либо гугли xlib mouse events, либо жди до завтра и я выложу сорс.


Название: Re: Имитация мышки
Отправлено: west от Февраль 26, 2008, 10:30
Я пошел гуглить, но сорсы жду с нетерпеньем ;)


Название: Re: Имитация мышки
Отправлено: SiRuS от Февраль 27, 2008, 18:56
Код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <unistd.h>

#include <X11/Xlib.h>
#include <X11/Xutil.h>

void mouseClick(int button)
{
Display *display = XOpenDisplay(NULL);

XEvent event;

if(display == NULL)
{
fprintf(stderr, "Errore nell'apertura del Display !!!\n");
exit(EXIT_FAILURE);
}

memset(&event, 0x00, sizeof(event));
event.type = ButtonPress;
event.xbutton.button = button;
event.xbutton.same_screen = True;

XQueryPointer(display, RootWindow(display, DefaultScreen(display)), &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.subwindow = event.xbutton.window;

while(event.xbutton.subwindow)
{
event.xbutton.window = event.xbutton.subwindow;

XQueryPointer(display, 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);
}

if(XSendEvent(display, PointerWindow, True, 0xfff, &event) == 0) fprintf(stderr, "Errore nell'invio dell'evento !!!\n");

XFlush(display);

usleep(100000);

event.type = ButtonRelease;
event.xbutton.state = 0x100;

if(XSendEvent(display, PointerWindow, True, 0xfff, &event) == 0) fprintf(stderr, "Errore nell'invio dell'evento !!!\n");

XFlush(display);
XCloseDisplay(display);
}
int main(int argc,char *argv[])
{
if(argc!=3)
{
printf("Usage: %s <clics> <sec>\n",argv[0]);
exit(0);
}
int i;
int cl=atoi(argv[1]);
while(1)
{
for(i=0;i<cl;i++)
mouseClick(1);
sleep(atoi(argv[2]));
}
return 0;
}
Собственно работа с евентами чесно взята с буржуйского сайта. С какого точно не помню..