Mä oon pari vuotta koodannu eri näkösiä funktioita jotka liikuttaa kursorin tiettyyn X, Y kohtaan mahdollisimman ihmismäisesti.
Tässä esimerkiksi tämän hetkinen aidoin hiiren liikutus, mikä mulla on:
Private Declare Function timeGetTime Lib "winmm.dll" () As Long Private Declare Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As Long Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long Private Declare Function GetWindowRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As Long Public Const Pi = 3.141592654 Public Type POINTAPI x As Long y As Long End Type Private Type RECT Left As Long Top As Long Right As Long Bottom As Long End Type Private Sub Wait(ByVal ms As Long) ms = timeGetTime() + ms Do: DoEvents: Loop While ms > timeGetTime() End Sub Public Function Rand(ByVal Low As Long, ByVal High As Long) As Long Randomize Rand = Int((High - Low + 1) * Rnd) + Low End Function Public Sub iMouse(ByVal hwnd As Long, ByVal x As Long, ByVal y As Long, _ ByVal range As Long, ByVal segments As Long, _ ByVal pcount As Long, ByVal delay As Long) Dim u As Double, nc1 As Double, nc2 As Double, nc3 As Double, nc4 As Double Dim dummyp As POINTAPI, p1() As POINTAPI, p2() As POINTAPI Dim r As RECT, i As Long ReDim p2(0) ReDim p1(pcount + 2) On Error Resume Next If segments < 15 Then segments = 50 segments = segments + Rand(-12, 12) GetCursorPos dummyp GetWindowRect hwnd, r x = x + Rand(-range, range) + r.Left y = y + Rand(-range, range) + r.Top If pcount < 3 Then pcount = 3 If (Abs(dummyp.x - x) + Abs(dummyp.y - y)) < 150 Then pcount = 3 segments = 15 End If For i = 0 To pcount + 2 Select Case i Case Is < 2: p1(i) = dummyp Case Is >= pcount: p1(i).x = x: p1(i).y = y Case Else p1(i).x = Min(dummyp.x, x) + Rnd() * Abs(dummyp.x - x) p1(i).y = Min(dummyp.y, y) + Rnd() * Abs(dummyp.y - y) End Select Next i For i = 1 To pcount For u = 0 To 1 Step (1 / segments) nc1 = -(u ^ 3) / 6 + (u * u) / 2 - u / 2 + 1 / 6 nc2 = (u ^ 3) / 2 - (u * u) + 2 / 3 nc3 = (-(u ^ 3) + u * u + u) / 2 + 1 / 6 nc4 = (u ^ 3) / 6 dummyp.x = nc1 * p1(i - 1).x + nc2 * p1(i).x + nc3 * p1(i + 1).x + nc4 * p1(i + 2).x dummyp.y = nc1 * p1(i - 1).y + nc2 * p1(i).y + nc3 * p1(i + 1).y + nc4 * p1(i + 2).y ReDim Preserve p2(UBound(p2) + 1) p2(UBound(p2)) = dummyp Next u Next i For i = 1 To UBound(p2) - 1 SetCursorPos p2(i).x, p2(i).y Randomize Wait Rand(0.1, 6) Next i End Sub Private Function Min(ByVal val1 As Long, ByVal val2 As Long) As Long Min = val1 If (val2 < val1) Then Min = val2 End Function
Mutta en keksi mitää tapaa jolla hiiren saisi liikkummaan tiettyyn kohtaan "harhailevasti/hapuilevasti"...? Esim. tuo yllä oleva koodi liikuttaa hiiren hienoissa kaarissa kohtaan, mutta jo siitä huomaa ettei kyseessä ole ihminen joka hiirtä liikuttaa.
Tässä paint kuva hiiren liikutuksista
Mä oon yrittäny tota vaaleenpunasta tyyliä mutta tuloksena oli nuo punaiset liikutukset :D
Sininen on suurin piirtein sama kuin tuossa ylläolevassa koodissa. Ne kohdat missä viivat alkaa on kohtia joissa hiiri oli ennen kuin hiiri lähtee liikkeelle.
Tuota tyyliä mitä yritän tehdä ei kai voi tehdä millään matemaattisilla pii laskuilla?
Olisiko jostain häiriö algoritmista apua, esim:
Yksi mahdollisuus on se, että hiirtä liikutetaan koko ajan lähemmäksi pistettä, mutta myös sivuille (eli jos hiiren ja kohteen välinen kulma on 0°, liikutetaan myös 90°, ja 270° kulmissa). Sivuille liikutusta tehdään sitä vähemmän, mitä lähempänä kohdetta hiiri on, mutta kannattaa asettaa myös jokin rajoitus, koska muuten hiiri saattaa liikkua aivan liian kauas kohteesta.
Kuten varmaan tiedätkin, kulma lasketaan arkustangentilla ja välimatka Pythagoraan lauseella.
Pieniä kommentteja koodista: sinun tulisi kutsua Randomizea vain kerran / ohjelma. Tähän hätään en tosin muista perustetta, mutta asiasta kyllä löytää infoa hakemalla.
Toisekseen, Wait-funktiosi tekee turhan raskaita kutsuja millisekuntien tarkkuisiin odotuksiin nähden. Voit käyttää Sleep-funktiota aiheuttamaan tauon. Lisäksi voit tarkistaa onko raskaan DoEventsin kutsumiselle tarvetta GetQueueStatus-funktiolla. Näillä muutoksilla saat todellisen funktion keston lähemmäs annettua millisekuntiarvoa.
Ainakin omaa touchpadin käyttöäni voisi ehkä simuloida hieman ohi osuvalla alkuvauhdilla, jousella ja kitkalla, jos fysiikka on ollenkaan hyppysissä.
Kiitoksia vastauksista! Mietin tuota kulma juttua.
Merri: En käytä sleepiä koskaan koska se pysäyttää koko ohjelman sen ajaksi ja vaikuttaa jopa raskaammalta kuin tuo mun Wait funktio.
Löysin tälläisen hiiren liikutuksen.. en tiedä mitä script kieltä tuo on, mutta vois yrittää kääntää sitä VB:lle
procedure WindMouse(xs, ys, xe, ye, gravity, wind, minWait, maxWait, maxStep, targetArea: extended); var veloX, veloY, windX, windY, veloMag, dist, randomDist, lastDist, step: extended; lastX, lastY: integer; sqrt2, sqrt3, sqrt5: extended; begin sqrt2:= sqrt(2); sqrt3:= sqrt(3); sqrt5:= sqrt(5); while hypot(xs - xe, ys - ye) > 1 do begin dist:= hypot(xs - xe, ys - ye); wind:= minE(wind, dist); if dist >= targetArea then begin windX:= windX / sqrt3 + (random(round(wind) * 2 + 1) - wind) / sqrt5; windY:= windY / sqrt3 + (random(round(wind) * 2 + 1) - wind) / sqrt5; end else begin windX:= windX / sqrt2; windY:= windY / sqrt2; if (maxStep < 3) then begin maxStep:= random(3) + 3.0; end else begin maxStep:= maxStep / sqrt5; end; end; veloX:= veloX + windX; veloY:= veloY + windY; veloX:= veloX + gravity * (xe - xs) / dist; veloY:= veloY + gravity * (ye - ys) / dist; if hypot(veloX, veloY) > maxStep then begin randomDist:= maxStep / 2.0 + random(round(maxStep) / 2); veloMag:= sqrt(veloX * veloX + veloY * veloY); veloX:= (veloX / veloMag) * randomDist; veloY:= (veloY / veloMag) * randomDist; end; lastX:= Round(xs); lastY:= Round(ys); xs:= xs + veloX; ys:= ys + veloY; if (lastX <> Round(xs)) or (lastY <> Round(ys)) then MoveMouse(Round(xs), Round(ys)); step:= hypot(xs - lastX, ys - lastY); wait(round((maxWait - minWait) * (step / maxStep) + minWait)); lastdist:= dist; end; if (Round(xe) <> Round(xs)) or (Round(ye) <> Round(ys)) then MoveMouse(Round(xe), Round(ye)); end;
(Mod. laittoi oikeat kooditagit.)
Muista myös se, että hiirtä liikutetaan sitä hitaammin, mitä lähempänä kohdetta se on. Hiiren kohdetta voi myös pitää pienen matkan päässä oikeasta kohteesta, kun hiiri on vielä jonkin matkan päässä.
p.s. Pascal ei ole skriptikieli, vaan ihan ohjelmointikieli.
Aihe on jo aika vanha, joten et voi enää vastata siihen.