Oppure

Loading
31/03/12 18:58
matteorm83
Salve a tutti,

vi illustro il mio problema:

ho realizzato una macro (VBA excel) che simula l'input a tastiera e mouse (non mi perdo nel dettaglio, facciamo finta per semplicità che il programma clicchi in sul tasto bottone "office" di paint e successivamente, nella schermata che si è aperta, sul pulsante "salva";).

 
Declare Function SetCursorPos Lib "User32" (ByVal X As Long, ByVal Y As Long) As Long 'Funzione muovi cursore

Declare Sub mouse_event Lib "User32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)
Private Const MOUSEEVENTF_LEFTDOWN = &H2        ' left button down
Private Const MOUSEEVENTF_LEFTUP = &H4          ' left button up
Private Const MOUSEEVENTF_RIGHTDOWN = &H8       ' right button down
Private Const MOUSEEVENTF_RIGHTUP = &H10        ' right button up

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Sub Salva_File()
        AppActivate "Immagine - Paint"
        Sleep (5000)
        Call SetCursorPos(25, 25) 'Posiziona cursore sul pixel 25,25
        Sleep (500)
        Call mouse_event(MOUSEEVENTF_LEFTDOWN, 25, 25, 0, 0) 'click tasto sx
        Sleep (100)
        Call mouse_event(MOUSEEVENTF_LEFTUP, 25, 25, 0, 0) 'rilascia tasto sx
        Sleep (1000)
        Call SetCursorPos(58, 155)  'Posiziona cursore sul pixel 25,25
        Sleep (100)
        Call mouse_event(MOUSEEVENTF_LEFTDOWN, 58, 155, 0, 0) 'click tasto sx
        Sleep (100)
        Call mouse_event(MOUSEEVENTF_LEFTUP, 58, 155, 0, 0) 'rilascia tasto sx

End Sub 


Il mio problema è la sincronizzazione tra quello che esegue il programma e quello che avviene sullo schermo. Per far questo ho usato la funzione sleep() in modo da ritardare le azioni eseguite...

Tuttavia non è molto affidabile. Se ad esempio dopo il primo click la schermata tarda ad aprirsi il mio programma non se ne accorge e potrebbe eseguire il secondo click a vuoto!

Esiste una maniera per rilevare ciò che avviene sullo schermo in modo che le azioni della macro ne vengano subordinate?

Grazie anticipatamente.
Ultima modifica effettuata da matteorm83 31/03/12 20:25
aaa
31/03/12 19:20
nessuno
Ma prima di tutto, di cosa parliamo ?

E' un programma scritto in VB6 (Visual Basic 6) ?

O è VBA di Excel ?
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
31/03/12 19:44
nessuno
In realtà questo è il forum per il Visual Basic 6 e non per VBA, ma è quello che più si avvicina ... in ogni caso, dato che il problema non è chiarissimo, mostra il codice che esegui e descrivi i problemi in relazione a tale codice.
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
01/04/12 9:14
Renny
Ciao.
Si, così è poco affidabile. Le alternative potrebbero essere di aumentare i tempi di latenza, in modo da essere sicuro che paint sia aperto.. Magari metti sleep 10 secondi.
Oppure dovresti mettere il tuo programma VBA in attesa tramite un ciclo infinito ponendo come condizione di uscita da verificare l'apertura del thread di paint.
Tempo fa ho avevo fatto una macro di Excel per velocizzare l'inserimento dati su un'altra applicazione.
Dunque, le istruzioni che servono a te sono queste:
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function GetForegroundWindow Lib "user32" () As Long
If FindWindow(vbNullString, "Immagine - Paint") = GetForegroundWindow

Questo IF verifica che la finestra in primo piano sia quella del PAINT. Se si esci dal ciclo e usi le istruzioni per sposti il mouse.
Facci sapere! :k:
Ultima modifica effettuata da Renny 01/04/12 9:21
aaa