Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    [VB.NET] Simulateclick e threading

    Ho bisogno di simulare dei click in determinate posizioni ogni tot secondi, essendo questi click ripetitivi avevo pensato quindi ad un ciclo. Inoltre pensavo per dargli una pausa temporale tra un click e l'altro di utilizzare i thread in questo modo:

    codice:
    Public Class x3
        'variabile per il ciclo di funzionamento
        Dim a As Integer
        'Funzione per simulare il click del mouse in determinate coordinate
        Enum meFlags As Integer
            MOUSEEVENTF_MOVE = &H1
            MOUSEEVENTF_LEFTDOWN = &H2
            MOUSEEVENTF_LEFTUP = &H4
            MOUSEEVENTF_RIGHTDOWN = &H8
            MOUSEEVENTF_RIGHTUP = &H10
            MOUSEEVENTF_MIDDLEDOWN = &H20
            MOUSEEVENTF_MIDDLEUP = &H40
            MOUSEEVENTF_XDOWN = &H80
            MOUSEEVENTF_XUP = &H100
            MOUSEEVENTF_WHEEL = &H800
            MOUSEEVENTF_VIRTUALDESK = &H4000
            MOUSEEVENTF_ABSOLUTE = &H8000
        End Enum
        Declare Sub mouse_event Lib "user32" (ByVal dwFlags As meFlags, ByVal Coords As Drawing.Point, ByVal dwData As Integer, ByVal dwExtraInfo As UIntPtr)
        Sub SimulateClick(ByVal Location As Drawing.Point)
            Dim trect As Drawing.Rectangle = Screen.GetBounds(Location)
            Dim tpnt As New Drawing.Point(65535.0 / trect.Width * Location.X, 65535.0 / trect.Height * Location.Y)
            mouse_event(meFlags.MOUSEEVENTF_MOVE Or meFlags.MOUSEEVENTF_ABSOLUTE, tpnt, 0, New UIntPtr(Convert.ToUInt32(0)))
            mouse_event(meFlags.MOUSEEVENTF_LEFTDOWN Or meFlags.MOUSEEVENTF_ABSOLUTE, tpnt, 0, New UIntPtr(Convert.ToUInt32(0)))
            mouse_event(meFlags.MOUSEEVENTF_LEFTUP Or meFlags.MOUSEEVENTF_ABSOLUTE, tpnt, 0, New UIntPtr(Convert.ToUInt32(0)))
        End Sub
    
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    
    
    
            Dim pnt As New Point(x1.Text, y1.Text)
            Dim pnt2 As New Point(x1.Text + 50, y1.Text + 20)
            a = 2
            While (a > 1)
                Threading.Thread.Sleep(5000)
                SimulateClick(pnt)
                Threading.Thread.Sleep(5000)
                SimulateClick(pnt2)
                Threading.Thread.Sleep(5000)
            End While
    
        End Sub
    
        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            a = 1
        End Sub
    End Class
    Praticamente il tutto cicla (alla pressione del button1) finchè a > 1 e con il button2_click simulo un tasto termina per stoppare il ciclo. Il problema è che con i thread.sleep "mi mette tutto in sleep" e quindi non è visualizzato il tasto per terminare tutto.

    Come posso fare a risolvere questo problema? posso utilizzare qualche altra funzione per simulare il tempo di attesa? per altro esiste un modo di conversione preciso del tempo dello sleep? cioè quei 5000 non mi sembrano 5 secondi!

    Sarebbe anche più ottimale se potessi simulare qualcosa del tipo "alle 8:30" esegui questo click.

    Vi ringrazio in anticipo per la vostra disponibilità,
    Neptune.
    "Estremamente originale e fantasioso" By darkiko;
    "allora sfiga crepuscolare mi sa che e' meglio di atmosfera serale" By NyXo;
    "per favore, già è difficile con lui" By fcaldera;
    "se lo apri te e invece di "amore" ci metti "lavoro", l'effetto è lo stesso" By fred84

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    I 5000 ms sono abbastanza precisi, abbastanza da non potere notarlo.

    Pero' vedo che, nel ciclo, tra il primo click e il secondo click c'e' una sola Sleep (quindi 5 secondi), ma tra il secondo click e il primo ci sono due Sleep (quindi 10 secondi) ... e' quello che volevi ?

    Il pulsante non ti appare perche' il sistema non ha il tempo di disegnarlo, dato che sta operando con un thread solamente che non rilascia il controllo a Windows. Inserisci una chiamata a DoEvents all'interno del ciclo while.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Originariamente inviato da oregon
    I 5000 ms sono abbastanza precisi, abbastanza da non potere notarlo.

    Pero' vedo che, nel ciclo, tra il primo click e il secondo click c'e' una sola Sleep (quindi 5 secondi), ma tra il secondo click e il primo ci sono due Sleep (quindi 10 secondi) ... e' quello che volevi ?

    Il pulsante non ti appare perche' il sistema non ha il tempo di disegnarlo, dato che sta operando con un thread solamente che non rilascia il controllo a Windows. Inserisci una chiamata a DoEvents all'interno del ciclo while.
    Scusami l'ignoranza, come inserisco la chiamata a DoEvents?

    Ad ogni modo i click e gli sleep li devo ancora settare, questo era solo uno di prova.
    "Estremamente originale e fantasioso" By darkiko;
    "allora sfiga crepuscolare mi sa che e' meglio di atmosfera serale" By NyXo;
    "per favore, già è difficile con lui" By fcaldera;
    "se lo apri te e invece di "amore" ci metti "lavoro", l'effetto è lo stesso" By fred84

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da Neptune
    Scusami l'ignoranza, come inserisco la chiamata a DoEvents?

    codice:
    Application.DoEvents()
    all'interno del ciclo ...

    Ad ogni modo i click e gli sleep li devo ancora settare, questo era solo uno di prova.
    Dato che parlavi di "precisione" della Sleep, ti avevo fatto notare il fatto che nel ciclo che hai mostrato (anche se di prova), per un click attendi 5 secondi e per l'altro ne attendi 10 ... ok?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Perchè ho provato a cambiare il codice così


    codice:
    My.Application.DoEvents()
                Threading.Thread.Sleep(5000)
                My.Application.DoEvents()
                SimulateClick(pnt)
                My.Application.DoEvents()
                Threading.Thread.Sleep(5000)
                My.Application.DoEvents()
                SimulateClick(pnt2)
                My.Application.DoEvents()
                Threading.Thread.Sleep(5000)
                My.Application.DoEvents()
    Ma praticamente "mi fa vedere la finestra a tratti" e comunque non mi ci fa cliccare gli altri pulsanti.
    "Estremamente originale e fantasioso" By darkiko;
    "allora sfiga crepuscolare mi sa che e' meglio di atmosfera serale" By NyXo;
    "per favore, già è difficile con lui" By fcaldera;
    "se lo apri te e invece di "amore" ci metti "lavoro", l'effetto è lo stesso" By fred84

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Hai due strade ...

    1) usi un altro thread che gestisca il ciclo dei click mentre il primo gestisce l'interfaccia e i pulsanti ...

    2) riduci il tempo di attesa (il valore dentro la Sleep) in modo che, tramite il DoEvents, il sistema riesca a gestire anche l'interfaccia ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Originariamente inviato da oregon
    Hai due strade ...

    1) usi un altro thread che gestisca il ciclo dei click mentre il primo gestisce l'interfaccia e i pulsanti ...

    2) riduci il tempo di attesa (il valore dentro la Sleep) in modo che, tramite il DoEvents, il sistema riesca a gestire anche l'interfaccia ...
    Potresti farmi un esempio pratico della prima possibilità? o è molto lunga la cosa e conviene che mi documento meglio? (nel caso da dove potrei documentarmi?).
    "Estremamente originale e fantasioso" By darkiko;
    "allora sfiga crepuscolare mi sa che e' meglio di atmosfera serale" By NyXo;
    "per favore, già è difficile con lui" By fcaldera;
    "se lo apri te e invece di "amore" ci metti "lavoro", l'effetto è lo stesso" By fred84

  8. #8
    Cercando su internet sono giunto alla seguente soluzione:

    1. Ho creato una sub con dentro tutto il codice per cliccare in questa maniera

    codice:
        Public Sub clicca()
            a = 2
            While (a > 1)
                Dim contatore As Integer = 0
                a = 2
                'Punto free user
                Dim pnt As New Point(x1.Text, y1.Text)
                'Punto download
                Dim pnt2 As New Point(x2.Text, y2.Text)
                'Punto salva su disco
                Dim pnt3 As New Point(x3.Text, y3.Text)
                'Punto ok
                Dim pnt4 As New Point(x4.Text, y4.Text)
                'Punto Salva
                Dim pnt5 As New Point(x5.Text, y5.Text)
                'Punto chiudi tabella
                Dim pnt6 As New Point(x6.Text, y6.Text)
                'Punto back back
                Dim pnt7 As New Point(x7.Text, y7.Text)
                'Punto non sovrascrivere
                Dim pnt8 As New Point(x8.Text, y8.Text)
                'Punto Annulla1
                Dim pnt9 As New Point(x9.Text, y9.Text)
                'Punto Annull2
                Dim pnt10 As New Point(x10.Text, y10.Text)
                'back
                'Threading.Thread.Sleep(5000)
                'SimulateClick(pnt7)
                'Threading.Thread.Sleep(5000)
                'SimulateClick(pnt7)
                'Threading.Thread.Sleep(5000)
                'SimulateClick(pnt7)
                'Threading.Thread.Sleep(5000)
                'SimulateClick(pnt7)
                'Threading.Thread.Sleep(5000)
                'SimulateClick(pnt7)
                'Threading.Thread.Sleep(5000)
                'non sovrascrivere
                'Threading.Thread.Sleep(5000)
                'SimulateClick(pnt8)
                'Threading.Thread.Sleep(5000)
                'SimulateClick(pnt9)
                'Threading.Thread.Sleep(5000)
                'SimulateClick(pnt10)
                'Threading.Thread.Sleep(5000)
                'back
                SimulateClick(pnt7)
                Threading.Thread.Sleep(5000)
                SimulateClick(pnt7)
                Threading.Thread.Sleep(5000)
                SimulateClick(pnt7)
                Threading.Thread.Sleep(5000)
                SimulateClick(pnt7)
                Threading.Thread.Sleep(5000)
                SimulateClick(pnt7)
                Threading.Thread.Sleep(5000)
                SimulateClick(pnt7)
                Threading.Thread.Sleep(5000)
                SimulateClick(pnt7)
                Threading.Thread.Sleep(5000)
                'clicca su free user
                SimulateClick(pnt)
                'aspetta 90 secondi abbondanti 110000
                Threading.Thread.Sleep(150000)
                'clicca su Download
                SimulateClick(pnt2)
                Threading.Thread.Sleep(10000)
                'clicca su salva su disco
                SimulateClick(pnt3)
                Threading.Thread.Sleep(10000)
                'clicca su ok
                SimulateClick(pnt4)
                Threading.Thread.Sleep(10000)
                'clicca su salva
                SimulateClick(pnt5)
                Threading.Thread.Sleep(10000)
                contatore = contatore + 1
    
                'aspetta un ora
                Threading.Thread.Sleep(3600000)
    
                'If (contatore = 16) Then
                contatore = 0
                SimulateClick(pnt6)
                Threading.Thread.Sleep(5000)
                'End If
    
    
    
            End While
        End Sub
    2. ho creato il thread collegato alla mia sub

    codice:
      Dim Thread1 As New System.Threading.Thread(AddressOf clicca)
    3. Sto cercando di far andare i due tastini che avviano e stoppano il thread, avevo creato questo codice:

    codice:
        Public Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    
            Thread1.Start()
    
        End Sub
    
        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            Thread1.Abort()
            'a = 1
        End Sub
    Il problema è che una volta che ho abortito il thread mi dice che è impossibile farlo ripartire, come ovvio a questa cosa? ho provato resume ma fa ripartire il thread dal punto in cui era prima mentre io vorrei farlo ripartire da zero.
    "Estremamente originale e fantasioso" By darkiko;
    "allora sfiga crepuscolare mi sa che e' meglio di atmosfera serale" By NyXo;
    "per favore, già è difficile con lui" By fcaldera;
    "se lo apri te e invece di "amore" ci metti "lavoro", l'effetto è lo stesso" By fred84

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Dovrebbe essere

    codice:
    Dim Thread1 As System.Threading.Thread
    e poi

    codice:
    Public Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
      Thread1 = New System.Threading.Thread(AddressOf clicca)
      Thread1.Start()
    End Sub
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  10. #10
    Originariamente inviato da oregon
    Dovrebbe essere

    codice:
    Dim Thread1 As System.Threading.Thread
    e poi

    codice:
    Public Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
      Thread1 = New System.Threading.Thread(AddressOf clicca)
      Thread1.Start()
    End Sub
    Ok grazie è perfetto così.

    Una curiosità, ma potrei gestire più thread assieme senza incorrere in gravi problemi di lentezza?
    "Estremamente originale e fantasioso" By darkiko;
    "allora sfiga crepuscolare mi sa che e' meglio di atmosfera serale" By NyXo;
    "per favore, già è difficile con lui" By fcaldera;
    "se lo apri te e invece di "amore" ci metti "lavoro", l'effetto è lo stesso" By fred84

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.