Mouse-ul si cum sa iti revendici locul in fata propriului calculator
19In ziua de azi calculatorul este un element cu care aproape ca traim in simbioza. Cui ii trebuie America (tara tuturor posibilitatilor), cand exista calculatorul (intruchiparea tuturor posibilitatilor)? Fiecare dintre noi avem pe birourile noastre cate o “poarta†catre toate posibilitatile. Toate bune si frumoase cat timp poarta isi asculta stapanul suprem, dar cerul parca se innegreste cand apare sora/fratele mai mica/mai mic sau parintele si spune: “LASA-MA SA VAD CUM E VREMEA MAINE†sau “E RANDUL MEU SA MA JOC!†sau “TREBUIE SA VORBESC CU GETA PE MESS ACUM!†si multe alte situatii. Dandu-te la o parte de la calculator in tine striga ceva: “dar mai vreau sa joc putin GTA!â€, “dar nu mi-am terminat de codat programul!â€, “dar ma uitam la un clip genial!†si raspunsul binenteles “NU MA INTERESEAZA!â€. Cata cruzime! Nu-i asa?
Dar cand e vorba de intruchiparea tuturor posibilitatilor, exista totdeauna o solutie pentru orice problema. Asa ca as vrea sa va prezint in acest articol 2 “vraji†(functii de sistem [c++]) care aplicate in diverse moduri vor speria orice parinte/sora/frate (utilizator obisnuit) si il/o vor face sa fuga repede la televizor inspaimantat(a).
Este vorba de : GetCursorPos() si SetCursorPos(), inocente la prima vedere. Binenteles ca sunt inocente la prima vedere dar ele ofera multe posibilitati! In acest articol va voi arata cum se poate “convinge mouseul†sa faca “nebunii†pe ecran.
Videoclip – Cum potri controla mouse-ul?
Explicatii – Cum poti controla mouse-ul?
In primul rand ecranul este reprezentat sub forma unui sistem cartezian cu originea in coltul stanga sus al ecranului. Coordonata x reprezinta coloanele si coordonata y reprezinta liniile.
• GetCursorPos are ca parametru o variabila de tip POINT. POINT este o structura de date formata din 2 numere intregi: x si y. Rolul acestei functii este sa gaseasca coordonatele pozitiei mouseului pe ecran si sa le stocheze in variabila de tip POINT.
• SetCursorPos are ca parametru 2 variabile de tip intreg. Rolul functiei este de a muta mouseul la pozitia specificata de parametrii x si y.
Un alt aspect important este faptul ca o limita pana la care pot creste x si y este chiar rezolutia ecranului. O data cu marirea rezolutiei se mareste si plaja de valori pe care o poat lua x si y.
Sa incepem printr-un program foarte simplu:
Programul de mai jos gaseste pozitia mouseului si apoi muta cursorul cu 10 pixeli mai jos.
#include<windows.h> #include<winuser.h> int main() { POINT pos; GetCursorPos(pos) SetCursorPos(pos.x,pos.y+10) ; return 0; }
Ok inofensiv programul pana acum, dar hai sa il facem sa mute cu 10 pixeli mai jos imediat ce simte miscare si sa se inchida in momentul apasarii oricarei taste.
#include<windows.h> #include<winuser.h> int main() { POINT pos,last; while(1) { if(kbhit()) return 0; GetCursorPos(&pos); if( pos.x!=last.x && pos.y!=last.y) { pos.y+=5; SetCursorPos(pos.x,pos.y); last=pos; } } return 0; }
Ok, eu zic ca nu e destul sa avem un program care sta si se uita la utilizator si asteapta sa se apeste pe taste. Hai sa il facem sa ruleze in background.
Dar atentie o data cu rularea in background trebuie sa se schimbe si modul de obtinere a tastelor apasate. Vom folosi o alta functie de sistem GetAsyncKeyState(int cod) care prinde tastele chiar si daca se muta focusul de pe programul nostru pe alt program.
Functia GetAsyncKeyState() primeste ca parametru codul unei taste virtuale si verifica daca aceasta este apasata sau nu returnand 0 in cazul in care nu este apasata. O tasta virtuala este un cod specific fiecarei taste, aceste coduri difera fata de cele ASCII cu exceptia numerelor (0-9) aflate deasupra tastelor. Numerele din numpad au alte coduri decat cele ascii.
#include<windows.h> #include<winuser.h> int main() { HWND stealth;// camuflam programul stealth=FindWindowA("ConsoleWindowClass",NULL); ShowWindow(stealth,0); POINT pos,last; while(1) { last=pos; GetCursorPos(&pos); if(GetAsyncKeyState('1'))//daca s-a apasat tasta b while(1) { SetCursorPos(last.x,last.y); if(GetAsyncKeyState('2'))//daca s-a apasat tasta 2 deblocam mouseul break; } if(GetAsyncKeyState('3'))//daca s-a apasat tasta 3 iesim din program return 0; } }
Ok acestea fiind zise, de aici incolo se poate face orice cu mouseul. Il putem face sa se plimba de nebun pe ecran, il putem face sa reactioneze la miscarile facute de utilizator, il putem face sa se comporte oricum.
Acum fiecare dintre voi cu ajutorul unui compilator de C++ si putina imaginatie puteti sa cereti mouseului sa “faca pe nebunulâ€!
Spor la treaba, astept sa imi spuneti ce idei de “concediu†aveti pentru mouseurile voastre, ce reactii au tintele programelelor voastre si sunt aici sa va raspund la intrebari legate de implementare si sa va dau idei de manipulare a mouseului.
Have fun 😉
Daca acest articol va avea success, voi publica o parte a 2 a a acestui articol in care va voi arata cum sa faceti un program care face mouseul sa se miste pe ecran dupa cum ii este dictat de o imagine de tipul BMP si voi coda cele mai interesante dintre propunerile voastre.
Eu zic ca acest mic program pe care l-ai facut tu ar fi extraordinar pentru protectia calculatoarelor.
Sa zicem de exemplu ca ai calculatorul intr-o camera de camin, nu vrei sa fie accesat de parintii, fratii, sau chiar remote.
Pur si simplu il pui la startup si daca bagi parola xx.. sa inchida programul, altfel mouse-ul sa faca cu totul si cu totul altceva decat ar fi fost normal sa faca.
aaa ce zici crezi ca ar fi o idee buna sa te apuci de un program de genul asta?
Daca as fi eu programator l-ai face eu 😀
Salut si mult succes in continuare.
e succes articolul, dar fa-l pentru toata lumea (utilizatori mai putini pasionati de programare si mai degraba pasionati de distractie): pune si o sursa la donwload
curiozitatea m-a impins sa incerc..si… foarte tare.. :)) dar nu ma surprinde programul in sine atat cat ma surprinde ideea.. geniala! :)) multa bafta in continuare…
@de ce? In general nu prezentam mini-aplicatiile astea in format executabil pentru ca ar putea aparea cei care ne suspecteaza ca infectam fisierele cu cine stie ce minunatii. Spre exemplu, multe solutii de securitate e posibil sa faca urat la codul de mai sus pentru ca foloseste niste Windows API-uri ce sunt tratate in general ca fiind suspecte. 😀
hehe, asta suna a scuza. ok, eu v-am dat o sugestie.
Poate fi interpretata si in acest mod. Oricum sugestia e luata in calcul. 🙂
Subscriu la ce a spus @de ce. Sunteti sadici daca ma puneti sa caut cartea de C++
Foarte draguta ideea, oricum poti fi in multe moduri sadic.
Exemple:
Iei soarecul cu tine.
Sau ca sa rasplatesti persoana care te-a fugarit de la pc poti sa inversezi toate comenzile :))
Sau cumperi o pisica „sa se ocupe” de soarec, dar sa o tii departe de Andrew :-„
Nu e nevoie de cartea de C++. Codul e scris integral, nu ii lipseste nimic, tot ce e necesar pentru crearea aplicatiei este un compilator de C++. 😀
Nu pot sa zic decat un lucru:
Genial 🙂
Vad ca v-a placut articolul destul de mult. Hai sa va da o idee despre partea a 2 a.
Voi arata cum se poate face un program care se plimba pe ecran dupa cum ii dicteaza o poza facuta de oricine in paint. Apoi voi arata cum se poate utiliza o parola pentru introducerea comenzilor.(ca sa nu se prinda surioara obsedata de messenger care sunt tastele care blocheaza si deblocheaza 😀 )
Si in plus va voi arata cum se simuleaza click dreapta si stanga cu mouseul. Si multe alte mostre de functii care sa il trimita pe soarec direct pe pista de curse. 😉
Nu stiu unde au disparut restul comentarilor.
Ai cateva greseli de scris, printre care cea mai ciudata : „Asa ca as vrea sa va prezint in acest 2 “vraji†”
Anyway, am observat ca nimeni nu a testat codul. In fiecare bucata de cod ai „windowsSPATIU.h” si „winuserSPATIU.h”. Iar winuser.h nu stiu de ce il folosesti pentru ca am observat ca functioneaza si fara. In prima bucata de cod la linia 6 ar trebui GetCursorPos(&pos) (lipsea operatorul care ne returneaza adresa) si ar mai trebui ” ; ” dupa acel apel de functie.
In a doua bucata de cod folosesti functia kbhit. Visual C++ -ul meu nu o recunoaste. Din cate am observat, nu se afla in standard. ( http://www.cprogramming.com/fod/kbhit.html )
In ultima bucata de cod este o problema pentru ca variabila de tip POINT pos, nu este initializata.
Ar trebui facut prima data un apel GetCursorPos(&pos); iar abia apoi last=pos; .
Cand renovezi blogul :D?
wtf? de ce dispar constant comentariile de pe blogul asta? deja parca imi pare rau ca am pierdut timp lasand cateva cuvinte sc rise
Imi cer scuze pentru greselile facute. Eram foarte nehotarat in legatura cu modul de exprimare si tot stergeam bucati in articol. E primul meu articol.
Codul a fost testat pe Dec C++ si MinGW studio (fara spatiul ala din headere 😀 alta greseala care mi s-a strecurat printre degete). Nu stiu daca a aparut de curand un o forma noua, astea 2 compilere sunt in acord cu standardele putin mai vechi. De exemplu o functie care apartine familiei borland este clrscr() si nu e standard (nu functioneaza in mingw).
O sa repar greselile cat de curand!
Salutare din nou. Se pare ca exista o mica problema privind comentariile pe blog. Cateva au disparut de ochiul publicului desi in baza de date le am.
@de ce? Comentariile nu ti-au disparut, voi reface imediat. 🙂
@Cristian Curand, mai exact pe 29. 🙂
LE : Am descoperit problema. O rezolvam in cateva secunde. 🙂
Haha, nice tool, insa nu mai locuiesc cu parintii de multa vreme sa testez totul.
Thanks !
Salutare.
Am testat programele. Merg de minune, dar am o intrebare : Cum pot face ca mouse-ul sa aiba un delay, adica sa apuci sa vezi cu ochiul liber miscarea. De exemplu sa mearga in patrat, sau triunghi, daca-i dai coordonatele.
Numai bine.
Salutari.
Ca sa faci mouseul sa se miste la o viteza rezonabila poti folosi functia de sistem
Sleep(int valoare);
De exemplu faci un ciclu in care dintr-un vector iti iei coordonatele mouseului, la fiecare rulare a ciclului se apelezi functia sleep (vezi tu ce valoare pui acolo ca sa faci mouseul sa se miste dupa cum vrei, eu recomand valori intre 1 si 10).
uite un exemplu:
int i,x[100], y[100];
i=0;//sa zicem ca ai 100 de valori in vectorii aceia
while(i<100)
{
SetCursorPos(x[i],y[i]);
Sleep(1);
++i;
}
Poti chiar si sa nu folosesti Sleep. Vei vedea ca merge destul de repede, depinde de procesor si de os. Daca nu folosesti Sleep si tot vrei sa mearga mouseul mai repede poti sa cresti i ul cu 2 cu 3 sau cu valor mai mari.
Mult succes. Si stay tune ca vine partea a doua din articol cu chestii si mai interesante.
Salut.
Nu stiu daca se poate face asa ceva nu stiu deloc C++.Ar fi interesant daca ai face un program pt. tastatura cand scrii sa nu apara litera respectiva cand apesi litera a la tastatura sa scrie b.Ar fi foarte tare.