Sendkeys

Iniciado por ViCrack€r, 19 Agosto 2005, 03:05 AM

0 Miembros y 2 Visitantes están viendo este tema.

ViCrack€r

Hola, quiero hacer un programa que se comunica con otro:
Programa 1 ---  1 Textbox para escribir un número
                        1 Boton para que me compare el número que he escrito con el numero válido
                        1 Testbox en el que sale Bien o Mal


Programa 2 ---  1 Boton para hacer estas operaciones
   Manda 1 numero con SendKeys n, True
   Manda SendKeys ("{tab}") para saltar al boton
   Manda SendKeys ("{ENTER}") para que compruebe si el número introducido es el válido.
   Si el número no es válido se vueve ha realizar la misma operación pero el valor del número a enviar es n=n+1

El problema está en que yo puedo ver si el número es correcto o no porque me lo dice el segundo Testbox del programa 1, pero el Programa 2 no se como hacer para que lea lo que pone en el segundo Textbox (que pone bien o mal).

¿Como puedo captar el valor del Textbox (programa 1) desde el programa 2?

Gracias y saludos.


ZEALOT

#1
CitarEl problema está en que yo puedo ver si el número es correcto o no porque me lo dice el segundo Testbox del programa 1, pero el Programa 2 no se como hacer para que lea lo que pone en el segundo Textbox (que pone bien o mal).

¿Como puedo captar el valor del Textbox (programa 1) desde el programa 2?

este es mas o menos el codigo, para una explicacion mas detallada de esto ve a este thread donde explico un poco deestas apis: http://foro.elhacker.net/index.php/topic,82701.0.html

======EN UN MODULO======
Option Explicit
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Public Declare Function EnumChildWindows Lib "user32" (ByVal hWndParent As Long, ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
Public Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hWnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Public Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hWnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

Public Const WM_GETTEXT = &HD
Public Const WM_GETTEXTLENGTH = &HE
Type LV_TEXT
    sItemText As String * 80
End Type
Public CajaTexto As Long
Public Function Procesos(ByVal hWnd2 As Long, lParam As String) As Boolean
Dim Nombre As String * 255, nombreClase As String * 255
Dim Nombre2 As String, nombreClase2 As String, texto As LV_TEXT ' * 255
Dim X As Long, Y As Long, nCount As Long, jaja As Long
X = GetWindowText(hWnd2, Nombre, 255)
Y = GetClassName(hWnd2, nombreClase, 255)

Nombre = Left(Nombre, X)
nombreClase = Left(nombreClase, Y)
Nombre2 = Trim(Nombre)
nombreClase2 = Trim(nombreClase)
If nombreClase2 = "ThunderRT6TextBox" And Nombre2 = "Text1" Then
   MsgBox "Bien"
   CajaTexto = hWnd2
   nCount = SendMessage(hWnd2, WM_GETTEXTLENGTH, 0, 0&)
   MsgBox "Bien2 " & nCount
   If nCount = 0 Then Exit Function
   jaja = SendMessage(hWnd2, WM_GETTEXT, nCount + 1, texto)
   MsgBox "Bien3 " & jaja
   MsgBox "Bien4 " & texto.sItemText
   Exit Function
End If
If Nombre2 = "" And nombreClase2 = "" Then
Procesos = False
Else
Procesos = True
End If
End Function

=====EN UN FORM=======
Dim hWnd1 As Long

Private Sub Command1_Click()
hWnd1 = 0
If Ventana = True Then
    EnumChildWindows hWnd1, AddressOf Procesos, 1 'lParam
Else
    hWnd1 = 0
    CajaTexto = 0
End If
Timer1.Enabled = True
End Sub

Private Sub Timer1_Timer()
If hWnd1 <> 0 Then
    Label1.Caption = "Encontrada"
    Call Procesos(CajaTexto, 0)
    EnumChildWindows hWnd1, AddressOf Procesos, 1 'lParam
Else
    Label1.Caption = "PAILAS"
    hWnd1 = 0
    CajaTexto = 0
    Timer1.Enabled = False
    Call Command1_Click
End If
End Sub

Private Function Ventana() As Boolean
hWnd1 = FindWindow(vbNullString, "Form1")
If hWnd1 > 0 Then Ventana = True
End Function

=========================
poner un textbox, timer con intervalo de 1000 y enabled=false, y un boton, y haz otro programa cambiale a este el caption
bye

ViCrack€r

Muchas Gracias por responder ZEALOT  , es un código muy interesante aunque no lo he podio hacer funcionar seguramente por algún fallo mio.

Al final de lo que has escrito:
=========================
poner un textbox, timer con intervalo de 1000 y enabled=false, y un boton, y haz otro programa cambiale a este el caption
bye


Donde pone haz otro programa cambiale a este el caption,
¿Es otro programa igual al primero?
¿Cambiarle el caption a un TestBox, o será el Text?

Otra cosa más, en el módulo:
MsgBox "Bien4 " & texto.sItemText

Veo que el sItemtext esta tipeado, pero el Texto que va delante desde donde se le hace referencia, ¿O será Texto un nombre que le has puesto a un control TestBox?

Venga ZEALOT, muchas gracias por responder y espero que me aclares mis dudas.

Una última pregunta, ¿este código funcionaría para capturar el contenido de un TestBox propiedad Text, que sea diferente del programa inicial que tu has explicado?

Porque este código, si no me equivoco es para dos programas iguales, pero ¿ Y si el 2 programa es diferente?

Gracias por la ayuda y saludos. 

ZEALOT

por cuestiones de tiempo he posteado a lo basto y no pude explicar que es lo que toca hacer, bueno entonces ahi va la explicacion:

en un pimer proyecto(programa1) pega el codigo que te he escrito en el form de ese proyecto pon un timer con un intervalo de 1000 y enabled=false, pon tambien un commad button y un label y por ultimo DEBES cambiarle el caption al formulario.

en el segundo proyecto(programa2) pon simplemente una caja de texto, y ponle el caption deseado al form, cuando hayas puesto caption al form, en el codigo del programa1(proyecto1) cambia donde dice: hWnd1 = FindWindow(vbNullString, "Form1")<---- "Form1" por tu caption del programa2.

luego arranca o ejecuta los dos programas y presiona el command button y saldra en el label si el programa1 ha encontrado la ventana del programa2, cada 1 segundo el timer del programa1 va revisar si esta la ventana del programa2 para espiar la caja de texto de este.

del codigo del modulo puedes quitar las siguientes lineas: "MsgBox "Bien3 " & jaja" Y "MsgBox "Bien2"  & nCount", como te digo apenas si alcancè a hacer el codigo y postear, me estaban hechando del computer  ;D en lo referente a "MsgBox "Bien4 " & texto.sItemText" la variable texto o mejor la estructura texto tiene un miembro que es sItemText por eso puse "texto.sItemText" como podras ver mas arriba està la declaracion de la estructura en el modulo:
Type LV_TEXT
    sItemText As String * 80
End Type

y mas abajo declaramos texto "texto As LV_TEXT", usted dira: porque hizo una estructura y no una variable tipo string?, pues facil si la pongo tipo string como casi todos sabemos en vb el tipo de datos string tiene un formato diferente al conocido en c/c++, y haciendo una estructura nos referimos a una direccion de memoria ni siquiera funcionaria poniendo StrPtr(varString) que es un puntero a string en vb, y este es otro programa diferente al que postee en el thread que le di, me voy porque otra vez me estan hechando otra vez  ::) :'(

ViCrack€r

Hola ZEALOT, estoy muy agradecido por tu rápida y clara respuesta, ha funcionado de maravilla, me detecta a la perfección si el segundo programa está en ejecución.  ;D

Ahora para completar el programa me gustaría saber como poner en el primer programa el valor del textbox del segundo programa.

Espero haberme explicado bien, se que no tanto como tu, pero lo he intentado.

Otra vez mil gracias.  ;D
Saludos.

ZEALOT

como veo que no pudiste, pos ahi te mando los proyectos:
he agregado una que otra funcion adicional.

http://www.mundointeractivo.net/rpm/TODO.rar

kakinets

Usa el Control Winsock hay mucho en el foro

Suerte

ViCrack€r

Hola ZEALOT, me he bajado los proyectos y los he probado, muchas gracias por tu atención prestada.

La parte del programa que indica si está o no en marcha el programa2 me funciona a las mil maravillas, pero el Label5, debería poner uno de estos 2 estados:
1 - el valor que esta en el programa2 es el correcto
2 - el valor que esta en el programa2 NO es el correcto

Pues no pone ni la primera opción ni la segunda, se queda en blanco, no se porque se queda en blanco.

Y yo pongo en marcha los 2 proyectos y pongo un valor en el textbox del programa2, y despues hago click en el boton Combrobar del programa 1, te lo he escrito para que no pienses que lo hago mal, ¿O a lo mejor si?

Espero que sea algo de fácil solución.

Saludos.  :D

Pedronets, no voy a utilizar el control Winsock porque estos proyectos no necesitan para nada conexión a Internet, son dos programas para comunicarse dentro del mismo ordenador.

Saludos.  :D