https://foro.gambas-es.org/viewtopic.php?f=1&t=3716&p=21010#p21010
-----------------------------------
jsbsan
Domingo, 23 Marzo 2014, 13:31

Re: Aplicación Con Interfaz Y Soporte De Scripts . Robot ?
-----------------------------------
Shell:

[quote] Robot ?[/quote]
Realmente, lo que estas haciendo un bot para tu aplicación... puede ser interesente para hacer "tutoriales" de los propios programas, para enseñar lo que hace el programa, por ejemplo.

Quizás para hacer  verdaderos "scripts" para los programas, lo suyo seria crear un interprete de comandos especificos de programa, y así trabajar directamente con las funciones del programa  (y no trabajar con controles visuales (los botones, menus).

El programa de jodacame, realmente implementa su propio "interprete de comandos", fijate en el código de la subrutina Timer2:

[code linenumbers=false syntax=gambas]Public Sub Timer2_Timer()
  ' Recorrido del script
  
  Application.busy = 1
  If ListViewListaOrdenes.Available Then 'Para controlar que no estamos en el final de la lista
    Filtro = False ' Para controlar si vamos a saltar una linea
    Label11.Caption = "Ejecutando: " & ListViewListaOrdenes.Item.Key & " (" & ListViewListaOrdenes.Item.text & ")" ' Mensaje de estado
    Select Case Left$(ListViewListaOrdenes.item.Text, 4) ' Verificamos el comando que se realizara
      Case "Mous"
        funciones.ejecutar_comando("xdotool mousemove " & Replace$(Right$(ListViewListaOrdenes.item.Text, Len(ListViewListaOrdenes.item.Text) - 6), ",", " "))
      Case "Coma"
        funciones.ejecutar_comando(Right$(ListViewListaOrdenes.item.Text, Len(ListViewListaOrdenes.item.Text) - 9))
      Case "clic"
        ' Verificamos si es click derecho o izquierdo
        If Mid$(ListViewListaOrdenes.item.Text, 7, 1) = 1 Then
          funciones.ejecutar_comando("xdotool click 1")
        Else
          funciones.ejecutar_comando("xdotool click 3")
        End If
      Case "Text"
        funciones.ejecutar_comando("xdotool type '" & Right$(ListViewListaOrdenes.item.Text, Len(ListViewListaOrdenes.item.Text) - 6) & "'")
      Case "Espe"
        Sleep Val(Right$(ListViewListaOrdenes.item.Text, Len(ListViewListaOrdenes.item.Text) - 14))
      Case "Salt"
        ListViewListaOrdenes.MoveTo(Val(Right$(ListViewListaOrdenes.item.Text, Len(ListViewListaOrdenes.item.Text) - 16)))
        Filtro = True
    End Select
    
    If Filtro = False Then
      ListViewListaOrdenes.MoveNext
    End If
  Else
    Label11.Caption = "Finalizado"
    If repitevalor > 1 Then  
      repitevalor -= 1
      ListViewListaOrdenes.MoveFirst()
      Timer2.Enabled = True
    Else
      Timer2.Enabled = False
    Endif
  End If
  Application.busy = 0
  
End
[/code]

Es simple pero efectivo.
Para mejorarlo ( hacerlo más fácil de ampliar, y de rehusar ), habría que usar el patron Strategy para eleminar el Selec Case y el patrón Comand (para implementar las ordenes o comandos).

Saludos


