Kurzor mozgás szimuláció

Kurzor mozgás szimuláció
2014-01-06T00:27:54+01:00
2014-02-12T13:34:34+01:00
2022-11-30T12:50:39+01:00
Questioner-man
Sziasztok,
A kurzort szertném irányítani 2 pont között. Pixelről pixelre haladok a pontok közötti legrövidebb úton. A sebesség szabályozásával van a probléma. Ha Sleep(1)-t használok, akkor 1 ms helyett kb 10-15 ms-t pihen, így nagyon lassú a mozgás. Ha Sleep(0)-ra átírom, vagy kitörlöm, akkor pedig olyan gyors, hogy nem is látszik a mozgás.

#include"stdafx.h" #include<time.h> int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){ int ran1,ran2,s,w; POINT Point; srand(time(0)); while(1){ if(GetAsyncKeyState(VK_ESCAPE)){exit(0);} GetCursorPos(&Point); ran1=rand()%1366; ran2=rand()%768; s=abs(Point.x-ran1); if(abs(Point.y-ran2)>s){s=abs(Point.y-ran2);} for(w=s;w>-1;w--){Sleep(1);SetCursorPos(ran1+(Point.x-ran1)*w/s,ran2+(Point.y-ran2)*w/s);} }}
Mutasd a teljes hozzászólást!

  • Nincs mit tenni.

    Google keresés "sleep 1 sleeps longer" nem jutott eszedbe?


    Egyébként:
    ran1=rand()%1366; ran2=rand()%768;

    Éljen soká a platformfüggetlenség!
    Mutasd a teljes hozzászólást!
  • Beraksz egy pl. for ciklust a sleep helyett


    int delay_max = 10 ; //ezzel kísérletezel; for (int ii=0; ii<delay_max; ii++);
    Nem szép de hatásos.
    Mutasd a teljes hozzászólást!
  • A megoldás, hogy nem bízol a Sleep függvényben, hanem mindig a ténylegesen eltelt idő alapján helyezed a kurzort.

    #include <unistd.h> #include <time.h> #include <X11/X.h> #include <X11/Xlib.h> #include <X11/Xutil.h> #include <cmath> void SimulateMoveCursor(int FromX, int FromY, int ToX, int ToY, int TimeMs, int GranMs = 5); int main(int argc, char *argv[]) { SimulateMoveCursor(100, 100, 1000, 200, 800); return 0; } void MovePointer(int x, int y); void SleepMs(int ms); long GetTickCount(); double PosPropFunc(double time); void SimulateMoveCursor(int FromX, int FromY, int ToX, int ToY, int TimeMs, int GranMs) { long start = GetTickCount(); long elpased = 0; while ( elpased < TimeMs ) { double prop = PosPropFunc((double)elpased / TimeMs); MovePointer(FromX + (ToX - FromX) * prop, FromY + (ToY - FromY) * prop); SleepMs(GranMs); elpased = GetTickCount() - start; } MovePointer(ToX, ToY); } void MovePointer(int x, int y) { Display *dpy; Window root_window; dpy = XOpenDisplay(0); root_window = XRootWindow(dpy, 0); XSelectInput(dpy, root_window, KeyReleaseMask); XWarpPointer(dpy, None, root_window, 0, 0, 0, 0, x, y); XFlush(dpy); XCloseDisplay(dpy); } void SleepMs(int ms) { usleep(1000 * ms); } long GetTickCount() { timespec ts; clock_gettime(CLOCK_MONOTONIC, &ts); return ts.tv_sec * 1000 + ts.tv_nsec / 1000000; } double PosPropFunc(double timeprop) { // speed up, slow down: return -2 * pow(timeprop, 3) + 3 * pow(timeprop, 2); // constant speed: //return timeprop; }

    Itt a MovePointer, SleepMs, GetTickCount függvényeket át kell írnod Windows-ra (SetCursorPos, Sleep, GetTickCount).
    Mutasd a teljes hozzászólást!
  • Ez nem linuxos X desktop?
    Mutasd a teljes hozzászólást!
  • De igen, mint írtam, át kell őket írni. Én most nem tudom tesztelni, de szerintem kb így:

    void SimulateMoveCursor(int FromX, int FromY, int ToX, int ToY, int TimeMs, int GranMs) { long start = GetTickCount(); long elpased = 0; while ( elpased < TimeMs ) { double prop = PosPropFunc((double)elpased / TimeMs); SetCursorPos(FromX + (ToX - FromX) * prop, FromY + (ToY - FromY) * prop); Sleep(GranMs); elpased = GetTickCount() - start; } SetCursorPos(ToX, ToY); }
    Mutasd a teljes hozzászólást!
  • Azért van, mert a Sleep függvény bár msec-es felbontást fogad paraméterként, de 10-15 msec-nél csak ritkábban tud kevesebbet!

    Ha pontosabbat akarsz, akkor használhatod a Multimedia timer időzítőket, ahol is a timeBeginPeriod függvényen keresztül beállíthatsz valós 1msec-es felbontást is.
    Mutasd a teljes hozzászólást!
  • Ha netán megszeretnél téveszteni egy programot, akkor figyelj arra is, hogy az egér nem csak egyenesen mozog és nem mindig ugyanolyan gyorsan!
    Ha figyelném az egérmozgást, akkor az iylenekre biztos hogy figyelnék. Ez lenne az első szűrési pont :)



    Méréseket végeznék, magam és más felhasználók alapján és jó kis heurisztikát pakolni ennek megfelelően :)
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd