Page 1 sur 1

Action en arrière plan

Posté : ven. 09 août 2019 15:58
par Misa10
Bonjour je recherche la possibilité de faire des actions en arrière plan comme la recherche par image ou recherche couleur pixel déplacement souris clique souris et plein d'autre action . Via le handlers par exemple ? Est ce que c'est possible ?

Re: Action en arrière plan

Posté : ven. 09 août 2019 18:44
par walkson
Bonjour,
La seule méthode que je connaisse pour effectuer deux opérations simultanément, est d'utiliser un timer
Dans le code à titre d'exemple, vous avez un timer qui permet de colorer un rectangle pendant que le reste du programme lance un MsgBox puis un Array et enfin écrit dans un édit. Ces 3 opérations sont bloquantes mais ne gênent pas la coloration du rectangle.
Bien sur, vous pouvez créer d'autres taches comme la recherche d'images ou autres.
#include <Array.au3>
#include <WinAPIGdiDC.au3>
#include <WinAPIGdi.au3>
#include <EditConstants.au3>
#include <WindowsConstants.au3>
Global $k=0,$p = 0, $array[6]
$Gui = GUICreate("", 370, 140)
$label = GUICtrlCreateLabel('', 5, 5, 60, 60)
$edit = GUICtrlCreateEdit("", 70, 5, 280, 60,BitOR($ES_AUTOVSCROLL,$ES_WANTRETURN,$WS_VSCROLL))
$Start = GUICtrlCreateButton('star', 10, 70, 70, 25)
$Stop = GUICtrlCreateButton('stop', 170, 70, 70, 25)
GUISetState()
Global $hPic = GUICtrlGetHandle($label)
Global $hDC = _WinAPI_GetDC($hPic)
For $i = 0 To 5
   $array[$i] = $i
Next

While 1
   Switch GUIGetMsg()
       Case $Start
           _Start()
         MsgBox(0,"","")
         _ArrayDisplay($array)
         For $i = 33 To 255
            GUICtrlSetData($edit, Chr($i)," ")
            Sleep(100)
         Next


       Case $Stop
           _Stop()
       Case -3
         _WinAPI_ReleaseDC($hPic, $hDC)
           Exit
   EndSwitch
WEnd

Func _Start()
   GUIRegisterMsg(0x0113, "WM_TIMER")
   DllCall("User32.dll", "int", "SetTimer", "hwnd", $Gui, "int", 50, "int", 10, "int", 0)
EndFunc


Func _Stop()
   GUIRegisterMsg(0x0113, '')
    DllCall("user32.dll", "int", "KillTimer", "hwnd", $Gui, "int*", 50)
EndFunc

Func WM_TIMER()
   $k+=1
   If $k = 59 Then
      $p += 1
      $k = 0
   EndIf
   If $p = 60 Then _Stop()
   $c = $p * 1.6
   WinSetTitle($Gui, '', 'pixel ' &$k& '-' & $p)
   $color = _WinAPI_ColorAdjustLuma(0x0000FF, $c)
   _WinAPI_SetPixel ( $hDC, $k, $p, $color)
EndFunc
Il est préférable que l'opération dans le timer soit rapide. Ici le pixel est écrit tous les 10/1000 de seconde (DllCall("User32.dll", "int", "SetTimer", "hwnd", $Gui, "int", 50, "int", 10, "int", 0))

Re: Action en arrière plan

Posté : ven. 09 août 2019 19:52
par mikell
Ce code est spectaculaire mais il y a quand même des fameux temps de latence
Utilisé pour des actions en arrière plan (donc sans contrôle visuel) ça pourrait aboutir à des résultats, disons, étranges :twisted:
Pourquoi ne pas simplement faire plusieurs scripts ?

Re: Action en arrière plan

Posté : sam. 10 août 2019 17:54
par Misa10
Intéressant mais des temps de latence c'est pas possible . Je me suis donc intéressée au VM aujourd'hui mais sa fait lag mon pc malheureusement je vais chercher d'autres solutions