Spanish Se puede hacer un programa en b4j que teclee en un campo, un texto de forma automatica?

carlos7000

Well-Known Member
Licensed User
Longtime User
Deseo crear un programa que me permita teclear una clave dura en un campo de texto del navegador, ya que contiene símbolos que son difíciles de teclear. Antes el campo los aceptaba, pero ahora el desarrollador deshabilito la opción 'pegar texto', por lo que ahora toca teclear la clave, lo cual es bastante difícil y me toma varios intentos, a veces me bloquean y me toca resetear la clave.

Le pedí ayuda a Chatgpt para que escribiera un programa que simule la pulsación de las teclas del teclado y me escribió este programa. Al ejecutarlo el compilador dice que hay un error en la line 27, que no se como solucionar. Adjunto el programa y el mensaje de error.

B4X:
#Region Shared Files
#CustomBuildAction: folders ready, %WINDIR%\System32\Robocopy.exe,"..\..\Shared Files" "..\Files"
'Ctrl + click to sync files: ide://run?file=%WINDIR%\System32\Robocopy.exe&args=..\..\Shared+Files&args=..\Files&FilesSync=True
#End Region

'Ctrl + click to export as zip: ide://run?File=%B4X%\Zipper.jar&Args=Project.zip

Sub Process_Globals
    'Declarar aquí las variables globales
    Private fx As JFX
    Private MainForm As Form
    Private TextField1 As TextField
End Sub

Sub AppStart (Form1 As Form, Args() As String)
    MainForm = Form1
    MainForm.Title = "Ejemplo de simulación de pulsaciones de teclado"
    MainForm.RootPane.LoadLayout("MainPage")
    MainForm.Show
    
    'Crea una instancia de la clase Robot
    Dim robot As Robot
    robot.Initialize

    
    'Detecta cuando se presiona F5 y espera 2 segundos antes de simular las pulsaciones de teclado
    MainForm.RootPane.SetOnKeyPressed(Sub(event As KeyEvent)
        If event.KeyCode = KeyCodeToKeyEvent("F5") Then
            Sleep(2000)
            robot.keyPress(KeyCodeToKeyEvent("H"))
            robot.keyPress(KeyCodeToKeyEvent("o"))
            robot.keyPress(KeyCodeToKeyEvent("l"))
            robot.keyPress(KeyCodeToKeyEvent("a"))
            robot.keyPress(KeyCodeToKeyEvent(","))
            robot.keyPress(KeyCodeToKeyEvent(" "))
        
            'libera las teclas presionadas
            robot.keyRelease(KeyCodeToKeyEvent(" "))
            robot.keyRelease(KeyCodeToKeyEvent(","))
            robot.keyRelease(KeyCodeToKeyEvent("a"))
            robot.keyRelease(KeyCodeToKeyEvent("l"))
            robot.keyRelease(KeyCodeToKeyEvent("o"))
            robot.keyRelease(KeyCodeToKeyEvent("H"))
        End If
    End Sub)
End Sub

'Convierte un código de tecla en un evento de teclado
Private Sub KeyCodeToKeyEvent(KeyCode As String) As Int
    Dim event As KeyEvent
    event.Initialize(KeyCode, False, False, False, 0)
    Return event.KeyCode
End Sub


Public Sub Initialize
'    B4XPages.GetManager.LogEvents = True
End Sub

'This event will be called once, before the page becomes visible.
Private Sub B4XPage_Created (Root1 As B4XView)
    Root = Root1
    Root.LoadLayout("MainPage")
End Sub

'You can see the list of page related events in the B4XPagesManager object. The event name is B4XPage.

Private Sub Button1_Click
    xui.MsgboxAsync("Hello world!", "B4X")
End Sub

El error es este:

B4J Versión: 9.80
Parseando código. Error
Error al analizar el programa.
Descripción del error: La clave proporcionada no se encontró en el diccionario.
Ha ocurrido un error en la línea: 27 (B4XMainPage)
MainForm.RootPane.SetOnKeyPressed(Sub(event As KeyEvent)
 

Mariano Ismael Castro

Active Member
Licensed User
No estoy seguro si es realmente lo que necesitas, pero pruébalo. Das clic sobre el botón y 2 segundos después se escribe Hola o bien presiona F5 y esperas los 2 segundos
 

Attachments

  • PulsacionesTeclado.zip
    9.3 KB · Views: 159

carlos7000

Well-Known Member
Licensed User
Longtime User
No estoy seguro si es realmente lo que necesitas, pero pruébalo. Das clic sobre el botón y 2 segundos después se escribe Hola o bien presiona F5 y esperas los 2 segundos
Hola. Mariano Ismael Castro

Sí, es lo que necesito.

Le cuento que el programa funciona, en parte. Con algunos caracteres como '>' el programa se quiebra.

Le adjunto captura de video:

 

carlos7000

Well-Known Member
Licensed User
Longtime User

Attachments

  • jAWTRobot1.61.zip
    23.2 KB · Views: 162

carlos7000

Well-Known Member
Licensed User
Longtime User
Al programa le cambié una líneas para que fuera mas fácil "teclear" el texto 'ID' y el texto 'Password'

Las líneas son

B4X:
Private Sub Button1_Click
    EscribaTexto(TextField1.Text)
End Sub

Private Sub ButtonID_Click
    EscribaTexto(TextFieldID.Text)
End Sub

El codigo completo hasta ahora es

B4X:
#Region Shared Files
#CustomBuildAction: folders ready, %WINDIR%\System32\Robocopy.exe,"..\..\Shared Files" "..\Files"
'Ctrl + click to sync files: ide://run?file=%WINDIR%\System32\Robocopy.exe&args=..\..\Shared+Files&args=..\Files&FilesSync=True
#End Region

'Ctrl + click to export as zip: ide://run?File=%B4X%\Zipper.jar&Args=Project.zip

Sub Class_Globals
    Private Root As B4XView
    Private xui As XUI
    Private TextField1 As TextField
    Public robot As AWTRobot
    
    Private GameView As GameViewHelper
'    robot.Initialize

    Private TextFieldID As B4XView
    Private ButtonID As B4XView
End Sub

Public Sub Initialize
    B4XPages.GetManager.LogEvents = True
End Sub

'This event will be called once, before the page becomes visible.
Private Sub B4XPage_Created (Root1 As B4XView)
    Root = Root1
    Root.LoadLayout("MainPage")
    GameView.AddKeyListener("GameView", B4XPages.GetNativeParent(Me))
End Sub

'You can see the list of page related events in the B4XPagesManager object. The event name is B4XPage.

'Sub GameView_KeyPressed (KeyCode As String) As Boolean
'    Dim excepciones As List :    excepciones.Initialize
'    excepciones.AddAll(Array As String("Ctrl", "Backspace", "Enter","Delete", "End","Space"))
'    If excepciones.IndexOf(KeyCode) <> -1 Then Return
'   
'    'Dtecta cuando se presiona F7 y espera 2 segundos antes de simular las pulsaciones de teclado
'    If KeyCode = "F7" Then
'        EscribaTexto(TextField1.Text)
'    Else
'        Log("Tecla presionada " &KeyCode)
'        TextField1.Text = TextField1.Text & KeyCode 'Si no es F5 que escriba en el Campo de Texto
'    End If
'    Return True
'End Sub

Private Sub EscribaTexto(texto As String)
    Sleep(2000)
    robot.RobotType(texto)
End Sub

'Sub GameView_KeyReleased (KeyCode As String) As Boolean
'    Log("Teclas soltadas " &KeyCode)
'    Return True
'End Sub

Private Sub Button1_Click
    EscribaTexto(TextField1.Text)
End Sub

Private Sub ButtonID_Click
    EscribaTexto(TextFieldID.Text)
End Sub

Me toco deshabilitar las funciones GameView_KeyPressed y GameView_KeyReleased porque me estaban causando problemas para copiar y pegar.
 

carlos7000

Well-Known Member
Licensed User
Longtime User
Hola Mariano.

Quisiera mencionar que la función 'RobotPaste' es equivalente a la combinación de teclas 'Ctrl + V'. En la página en la que deseo ingresar la contraseña, el desarrollador ha restringido la opción de 'pegar', 'arrastrar', etc permitiendo únicamente la entrada de texto mediante la escritura manual.

La función que debería funcionar es 'RobotKeyPress', sin embargo, presenta problemas con algunos caracteres.

De todas formas muchas gracias por su aporte.


Hola no se si al final pudiste resolver pero te comparto una posible solución al problema.
 

carlos7000

Well-Known Member
Licensed User
Longtime User
Hace un rato, pensando de nuevo en el problema, disidí escribir el programa en C#. No había hecho por pereza. Pensaba que me tomaría mas tiempo que en b4J, y no fue así. Escribí el programa en 5 minutos o menos.

Muchas gracias todos por toda su ayuda y todos sus aportes.

Si a alguien le es útil el programa, lo dejo en el adjunto. fue hecho en Visual Studio.

imagen_2023-06-08_190259803.png
 

Attachments

  • Robot Tecleador.rar
    92.9 KB · Views: 108
Last edited:
Top