Foros del Web » Programación para mayores de 30 ;) » Programación General » Visual Basic clásico »

Visual Basic 2005: Usar SendMessage.

Estas en el tema de Visual Basic 2005: Usar SendMessage. en el foro de Visual Basic clásico en Foros del Web. Hola, pues es muy facil solo identificas el control textbox con la api FindWindowEx y despues le pasas el texto con la api SendMessageSTRING y ...

  #61 (permalink)  
Antiguo 12/09/2008, 22:51
Avatar de seba123neo  
Fecha de Ingreso: febrero-2007
Ubicación: Esperanza, Santa Fe
Mensajes: 1.046
Antigüedad: 18 años, 2 meses
Puntos: 19
Respuesta: Visual Basic 2005: Usar SendMessage.

Hola, pues es muy facil solo identificas el control textbox con la api FindWindowEx y despues le pasas el texto con la api SendMessageSTRING y con la constante WM_SETTEXT...

saludos.
__________________
" Todos Somos Ignorantes; lo que pasa es que no todos ignoramos las mismas cosas " - Albert Einstein
  #62 (permalink)  
Antiguo 13/09/2008, 22:14
Avatar de moradazo  
Fecha de Ingreso: julio-2008
Ubicación: [email protected]
Mensajes: 355
Antigüedad: 16 años, 10 meses
Puntos: 2
Respuesta: Visual Basic 2005: Usar SendMessage.

Hola seba123neo gracias por tu respuesta.

Mira hice algo así:

Código PHP:
'ClinCheck Comments es el nombre de la ventana'
        
hwnd1 FindWindow(vbNullString"ClinCheck")

'Este "Edit" es el textbox de la ventana ClinCheck, supongo'
        
hwnd2 FindWindowEx(hwnd10"Edit"vbNullString)

'Cuando sigue esta línea, me da un error'
        
SendMessageSTRING(hwnd2WM_SETTEXT0"texto"
El error es el siguiente: A call to PInvoke function 'Send Text!Send_Text.Form1::SendMessageSTRING' has unbalanced the stack. This is likely because the managed PInvoke signature does not match the unmanaged target signature. Check that the calling convention and parameters of the PInvoke signature match the target unmanaged signature.

Me guié de un código que creo tu pusiste en esta dirección: http://www.canalvisualbasic.net/foru....asp?TID=34737

A ver si ando equivocado en algo o que puede ser?
  #63 (permalink)  
Antiguo 13/09/2008, 22:41
Avatar de seba123neo  
Fecha de Ingreso: febrero-2007
Ubicación: Esperanza, Santa Fe
Mensajes: 1.046
Antigüedad: 18 años, 2 meses
Puntos: 19
Respuesta: Visual Basic 2005: Usar SendMessage.

bueno pero si copiaste y pegaste el ejemplo asi como esta en .NET no te va a andar, porque las api's tienen diferentes tipos de datos en visual basic 6 que en .NET...son diferentes...haber lo explico lo mas facil posible...

voy a hacer un ejemplo de como mandar un texto de un textbox de tu aplicacion al textbox de una aplicacion externa, en este caso el Notepad de windows...yo lo explico ..si ya lo sabes no importa seguro a alguien le va a servir..

como sabras podes usar el SPY++ para averiguar los nombres de clase de los controles...

este es el nombre de clase de la ventana padre llamada "Notepad":



este es el nombre del control dentro de la ventana llamado "Edit":



para saber los datos de la ventana tenes que arrastrar el "iconito" sobre una ventana y te va diciendo las partes que la forman,en este caso fijate que esta seleccionado el area de escritura del bloc de notas y al lado en la ventana estan los datos...

el handle es el numero(Long) que le asigna windows a cada ventana ,es como si fuera el numero que identifica esa ventana,sabiendo eso,podes hacer un monton de cosas,cerrarla,moverla,resizarla,cambiar valores,etc....

el Class es el nombre de clase del control,o sea cada control tiene su nombre...ese ese es que nos interesa ahora..

ahora fijate con este codigo como escribo en el bloc de notas..usando unas funciones api's...

Código:
Public Class Form1
    Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Integer
    Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Integer, ByVal hWnd2 As Integer, ByVal lpsz1 As String, ByVal lpsz2 As String) As Integer
    Private Declare Function SendMessageSTRING Lib "user32" Alias "SendMessageA" (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As String) As Integer
    Private Declare Function SendMessageLONG Lib "user32" Alias "SendMessageA" (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
    Private Const WM_SETTEXT = &HC

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Shell("notepad.exe", vbNormalNoFocus)
        Dim a As Long
        Dim b As Long
        a = FindWindow("Notepad", vbNullString)
        b = FindWindowEx(a, 0&, "Edit", vbNullString)
        SendMessageSTRING(b, WM_SETTEXT, 256, "Holaaaaaaaaaaaa")
    End Sub
End Class
lo unico que tenes que hacer ahora es adaptar eso a tu programa...

saludos.
__________________
" Todos Somos Ignorantes; lo que pasa es que no todos ignoramos las mismas cosas " - Albert Einstein
  #64 (permalink)  
Antiguo 14/09/2008, 01:14
Avatar de moradazo  
Fecha de Ingreso: julio-2008
Ubicación: [email protected]
Mensajes: 355
Antigüedad: 16 años, 10 meses
Puntos: 2
Respuesta: Visual Basic 2005: Usar SendMessage.

Muchas gracias me funcionó la adaptación que hice de ese código a mis necesidades

Solamente un asunto:
a = FindWindow("Notepad", vbNullString)

En mi caso, el nombre de clase cambia cada vez que hay una ejecución, como el hWnd, entonces opté por colocar otros datos y quedará así:

a = FindWindow(vbNullString, "Nombre de la ventana")

En mi caso, el nombre de la ventana siempre es el mismo no cambia así que me funciona correctamente. También tengo el Spy++ muchas gracias igual por explicarlo siempre es bueno aprender de los que saben.
  #65 (permalink)  
Antiguo 16/09/2008, 07:06
Avatar de moradazo  
Fecha de Ingreso: julio-2008
Ubicación: [email protected]
Mensajes: 355
Antigüedad: 16 años, 10 meses
Puntos: 2
Respuesta: Visual Basic 2005: Usar SendMessage.

Hablando nuevamente sobre este tema me surgio algo inesperado:

En principio ocupaba que un texto de un textbox en mi programa se copie y pegue en un campo de texto en otra ventana, sea web, sea otra aplicacion, sea notepad, etc.

Código PHP:
        Dim a As Long
        Dim b 
As Long
                a 
FindWindow(vbNullString"Nombre Ventana")

                
FindWindowEx(a0&, "Edit"vbNullString)
                
'Edit es el nombre de clase'

                
SendMessageSTRING(bWM_SETTEXT256TextBox1.Text
Este código hace lo que necesito, pero resulta que tengo esta ventana:



Todo lo hace bien, lo que pasa es que lo copia en el cuadro de abajo y ocupo que se copie en el cuadro de arriba, ambos tienen nombre de clase "Edit", lo que cambia es su hWnd cada vez que se abre esa ventana, pero como le puedo decir al programa que copie el texto en el cuadro que necesito?

Gracias!
  #66 (permalink)  
Antiguo 16/09/2008, 07:46
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 20 años
Puntos: 839
De acuerdo Respuesta: Visual Basic 2005: Usar SendMessage.

Si te fijas la función FindWindowEx recibe en el segundo parámetro un hWnd, lo que debes hacer es obtener el hWnd del primer Edit, y luego pasarle como parámetro ese mismo hWnd, con lo que obtendrás el hWnd del segundo Edit. Por ejemplo:
Código vb:
Ver original
  1. Dim fEdit As Long
  2. Dim lEdit As Long
  3. fEdit = FindWindowEx(a, 0&, "Edit", vbNullString)
  4. lEdit = FindWindowEx(a, fEdit, "Edit", vbNullString)
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.

Última edición por David; 16/09/2008 a las 08:47
  #67 (permalink)  
Antiguo 16/09/2008, 07:56
Avatar de moradazo  
Fecha de Ingreso: julio-2008
Ubicación: [email protected]
Mensajes: 355
Antigüedad: 16 años, 10 meses
Puntos: 2
Respuesta: Visual Basic 2005: Usar SendMessage.

Excelente David.

Precisamente estaba investigando sobre el hWnd hijo (hWndChildAfterA), ya que su orden es de su ventana hija inmediata, por eso tomo ese cuadro de primero. Pero pensaba que ese hWnd es como un orden de menor a mayor, de cero en adelante, estuve probando poner un uno pero como sabes no me corrio bien.

Gracias David muy amable de tu parte.
  #68 (permalink)  
Antiguo 16/09/2008, 10:00
Avatar de moradazo  
Fecha de Ingreso: julio-2008
Ubicación: [email protected]
Mensajes: 355
Antigüedad: 16 años, 10 meses
Puntos: 2
Respuesta: Visual Basic 2005: Usar SendMessage.

Disculpen las molestias de este tema tan largo, creo tener la última duda:

Tengo este codigo en un boton

Código PHP:

        wParam 
53278 'ID para abrir ventana'
        
lParam 0
        SendNotifyMessage
(hWndWM_COMMANDwParamlParam)
'El hWnd lo obtengo de otro modulo'
'El SendNotifyMessage abre una ventana llamada "Ventana"'

            
FindWindow(vbNullString"Ventana")
            
FindWindowEx(a0&, "Edit"vbNullString)
            
FindWindowEx(ab"Edit"vbNullString)
            
SendMessageSTRING(cWM_SETTEXT256TextBox1.Text
El problema que tengo es que al oprimir el botón debo hacerlo 2 veces para ver el texto copiado, la primera solo la abre, la segunda lo copia. A partir de ese momento siempre abrira y copiara en la primera vez, lo que quiero es que desde la primera vez no se tenga que oprimir el boton dos veces. Pareciera que la primera vez se salta el codigo de copiar el texto.

PD: Tambien me abria muchas ventanas cada vez que cliqueaba el botón, pero ya arreglé eso.

Gracias!
  #69 (permalink)  
Antiguo 16/09/2008, 10:02
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 20 años
Puntos: 839
Respuesta: Visual Basic 2005: Usar SendMessage.

Lo más probable es que esté copiando pero no muestra porque no actualiza la ventana . Prueba a pasarle el mensaje WM_PAINT después de cambiar el texto.
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #70 (permalink)  
Antiguo 16/09/2008, 10:15
Avatar de moradazo  
Fecha de Ingreso: julio-2008
Ubicación: [email protected]
Mensajes: 355
Antigüedad: 16 años, 10 meses
Puntos: 2
Respuesta: Visual Basic 2005: Usar SendMessage.

Interesante este WM_Paint, me sirvio de lujo como tus aportes David, gracias de verdad, por un momento pense en poner doble WM_SETTEXT o tal vez un While pensando que el codigo no tomaba aun el hWnd, varias maneras pero pues como no conozco aun varios de los WM mi desconocimiento es muy notable.


Código PHP:
SendMessageSTRING(cWM_SETTEXT256,TextBox1.Text)
SendMessageSTRING(cWM_PAINT256TextBox1.Text 
De nuevo gracias David, espero que este tema sea aprovechado por muchas personas.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:38.