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 a todos los amigos del foro. Quisiera saber como usar el api SendMessage. Necesito usarlo para salvar una aplicación externa, puedo obtener su hWnd, ...

  #1 (permalink)  
Antiguo 29/08/2008, 06:47
Avatar de moradazo  
Fecha de Ingreso: julio-2008
Ubicación: [email protected]
Mensajes: 355
Antigüedad: 15 años, 10 meses
Puntos: 2
Visual Basic 2005: Usar SendMessage.

Hola a todos los amigos del foro.

Quisiera saber como usar el api SendMessage. Necesito usarlo para salvar una aplicación externa, puedo obtener su hWnd, pero las demás variables no se como declararlas, a ver si me pueden dar una mano:

Declare Function SendMessage Lib "User32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

Necesito salvarlo ya sea que la ventana este minimizado, restaurado, maximizado o inactiva (detrás de otra ventana)

Si alguien me pudiera ayudar o bien decirme algún enlace que contenga esa información ya que he buscado por todos lados pero no encuentro lo que necesito, gracias!
  #2 (permalink)  
Antiguo 29/08/2008, 10:03
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
Exclamación Respuesta: Visual Basic 2005: Usar SendMessage.

Antes que nada, lo primero que habría que saber es qué hace realmente SendMessage:
http://msdn.microsoft.com/en-us/libr...50(VS.85).aspx

Básicamente, envía un mensaje a una ventana, las ventanas tienen un procedimiento que captura los mensajes y hace las acciones de acuerdo a ellas, por ejemplo, cuando presionamos alguna tecla en una ventana, esa ventana recibe los mensajes WM_KEYDOWN y WM_KEYUP. Cuando seleccionamos un menú se recibe el mensaje WM_MENUSELECT, etc.

Un pequeño problema que tenemos para usar SendMessage en Visual Basic es el lParam. .
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #3 (permalink)  
Antiguo 29/08/2008, 10:09
Avatar de moradazo  
Fecha de Ingreso: julio-2008
Ubicación: [email protected]
Mensajes: 355
Antigüedad: 15 años, 10 meses
Puntos: 2
Respuesta: Visual Basic 2005: Usar SendMessage.

Gracias David, donde puedo encontrar todos los WM?
  #4 (permalink)  
Antiguo 29/08/2008, 10:44
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
De acuerdo Respuesta: Visual Basic 2005: Usar SendMessage.

Aquí encontré una lista:
http://www.autohotkey.com/docs/misc/SendMessageList.htm
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #5 (permalink)  
Antiguo 29/08/2008, 11:40
Avatar de moradazo  
Fecha de Ingreso: julio-2008
Ubicación: [email protected]
Mensajes: 355
Antigüedad: 15 años, 10 meses
Puntos: 2
Respuesta: Visual Basic 2005: Usar SendMessage.

Ok David, entendiendo el concepto de SendMessage que amablemente has puesto, cada vez que se presiona una tecla en cierta ventana va enviar por default un WM_Keyup y un WM_keydown. Por lo tanto si, como sabes, quiero enviar un sendmessage a una aplicación (minimizada, restaurada, maximizada o inactiva) donde necesito que se presionen las teclas Ctrl y S (para salvar) entonces debe llevar siempre esos WM_Keyup y un WM_keydown junto con las teclas a presionar?

Necesito también el Key_event?

La lista que vemos en el link esta bien completa pero pensaba que usaba también teclas específicas como "Control" o una "S". Al ver que tampoco encontré uno que se llamara WM_Save para hacer que mi aplicación salva en cualquier estado, nuevamente me trae la duda de como puedo usar esta función del sendmessage para usar teclas. Gracias

SendMessage(hWnd, WM_MDIMAXIMIZE, 0, 0)

Supuse que maximiza pero no lo hace.

Última edición por moradazo; 29/08/2008 a las 11:54
  #6 (permalink)  
Antiguo 29/08/2008, 15:20
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
Respuesta: Visual Basic 2005: Usar SendMessage.

Ese mensaje no sirve para maximizar . De hecho, lo que puedes hacer con un mensaje es decirle a una ventana que se maximizó, pero eso no necesariamente va a maximizarla literalmente.

Para tu caso no te recomiendo que uses el Ctrl + S como WM_KEYUP y WM_KEYDOWN ya que el Ctrl + S no es procesado directamente por la ventana sino es un Hook para el menú. Creo que lo mejor en este caso sería usar el WM_MENUSELECT para simular que se hizo click en el menú Guardar.
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #7 (permalink)  
Antiguo 30/08/2008, 09:40
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
Exclamación Respuesta: Visual Basic 2005: Usar SendMessage.

Siento decirte que me equivoqué . Pero bueno, cualquier uno se equivoca . El WM_MENUSELECT es para cuando se selecciona un menú y no cuando se hace click en él, para cuando se hace click es WM_COMMAND. Por ejemplo, una prueba, obteniendo el hWnd del Bloc de Notas podemos simular un click en el Menú Abrir de esta forma:
Código PHP:
Dim hWnd As Long
Dim wParam 
As Long
Dim lParam 
As Long
hWnd 
FindWindow(Nothing"Sin título - Bloc de Notas")
wParam ' En wParam debemos pasar el ID del Menú '
lParam 0
SendMessage
(hWndWM_COMMANDwParamlParam
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #8 (permalink)  
Antiguo 01/09/2008, 07:20
Avatar de moradazo  
Fecha de Ingreso: julio-2008
Ubicación: [email protected]
Mensajes: 355
Antigüedad: 15 años, 10 meses
Puntos: 2
Respuesta: Visual Basic 2005: Usar SendMessage.

Gracias David por la sugerencia.

Probé el código que escribiste con el Notepad, haciendo un pequeño cambio pues mi Windows es en inglés por lo que el nombre del bloc de notas sería: "Untitled - Notepad"

En el momento de obtener el hWnd de esta ventana, me da un número alto, no es normal para un hWnd, puse un textbox para saber cual es el valor de este hWnd y me dio: 113997374161357318

Lamentablemente no me funcionó con este hWnd, entonces lo probé con el Treat donde si me devuelve un hWnd más creíble pero de igual manera no se porqué no me sirve el abrir un documento en el menú.

Como puedes ver en la imagen, arriba sale el hWnd por un label, por lo que creo no ocupar el FindWindow.



Y el código queda así:

Código PHP:
 Private Const WM_COMMAND = &H111
    
Private Sub Button1_Click(ByVal sender As System.ObjectByVal e As System.EventArgsHandles Button1.Click
        Dim wParam 
As Long
        Dim lParam 
As Long
        wParam 
' En wParam debemos pasar el ID del Menú '
        
lParam 0
        SendMessage
(Label1.TextWM_COMMANDwParamlParam)
    
End Sub 
No sé por que no usa el menú abrir, trataré de intentar con otros WM.
Gracias!
  #9 (permalink)  
Antiguo 01/09/2008, 08:52
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
Respuesta: Visual Basic 2005: Usar SendMessage.

Primero, ¿cómo estás definiendo el FindWindow?. Y segundo, primero debes obtener el ID del Menú para saber qué valor habrá que pasarle a wParam.

El ID del Menú puedes obtener usando GetMenu, GetSubMenu y GetMenuItemID.
Otra forma de obtenerlos es usar el Spy++ para ver qué valor está obteniendo en el mensaje WM_COMMAND al hacer click en el Menú del que quieres obtener el ID.
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #10 (permalink)  
Antiguo 01/09/2008, 09:05
Avatar de moradazo  
Fecha de Ingreso: julio-2008
Ubicación: [email protected]
Mensajes: 355
Antigüedad: 15 años, 10 meses
Puntos: 2
Respuesta: Visual Basic 2005: Usar SendMessage.

Hola David.

El Findwindow no lo estoy definiendo ni declarando por que es para obtener el hWnd de la ventana como te dije antes, ya lo obtuve por otro medio, con el label de la imagen anterior. Si no estoy bien pues entonces lo hare como tu me dices.

Y para obtener el ID del menu bueno use el Spy++ y este fue el resultado:



Solo queria preguntarte cual es el ID del menu open?
Gracias.
  #11 (permalink)  
Antiguo 01/09/2008, 09:07
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
Respuesta: Visual Basic 2005: Usar SendMessage.

No, no es así que podrás obtener el ID del Menú con el Spy++.

Lo que debes hacer es un hook de mensajes a la ventana del Treat (el mensaje WM_COMMAND) y luego hacer Click en el Menú del que quieres obtener el ID, luego en el Spy++ te va a mostrar el mensaje que recibió la ventana, el wParam y lParam, entonces, para simular que se hizo click en el menú solo debemos enviar ese mismo mensaje.
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #12 (permalink)  
Antiguo 01/09/2008, 09:33
Avatar de moradazo  
Fecha de Ingreso: julio-2008
Ubicación: [email protected]
Mensajes: 355
Antigüedad: 15 años, 10 meses
Puntos: 2
Respuesta: Visual Basic 2005: Usar SendMessage.

OK gracias por la recomendación pero David, lamento decirte que no supe como hacerlo, si tarde en responder era por intentar de todas formas tus pasos, es que seguramente no entendi o falta de conocimiento de hacer un "hook de mensajes".
Lo que hice fue intentar con el otro programa que me da el classname, ese me da mas informacion en donde ponga el puntero del mouse.



lo que pasa es que en cualquier opcion del menu FILE, me dan los mismos resultados que ves ahi. Puedo ver un ID arriba, que dice 0x0 pero no creo que sea valido. Solamente necesito saber bien como elegir el menu abrir, o bien el de Guardar, disculpa la molestia, gracias.
  #13 (permalink)  
Antiguo 01/09/2008, 09:41
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
Respuesta: Visual Basic 2005: Usar SendMessage.

Mira, para hacer el hook de mensajes con el Spy++ solo debes hacer click en el ícono Message Log:

Allí te permite elegir la ventana de la que quieres capturar los mensajes, en la pestaña Messages elige únicamente WM_COMMAND, luego haz Click en el Menú del que quieres capturar el ID y en el Spy++ te mostrará los parámetros recibidos en wParam (ID del Menú) y lParam.
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #14 (permalink)  
Antiguo 01/09/2008, 10:07
Avatar de moradazo  
Fecha de Ingreso: julio-2008
Ubicación: [email protected]
Mensajes: 355
Antigüedad: 15 años, 10 meses
Puntos: 2
Respuesta: Visual Basic 2005: Usar SendMessage.

Ok gracias David, ahora si pude, es que bueno el programa del Spy++ no lo conozco muy bien que digamos.

El programa me dio el resultado:

Del Open:
<00001> 003BOBF2 P WM_COMMAND wNotifyCode:0 (sent from a menu) wID: 57601

Del Save:
<00002> 003BOBF2 P WM_COMMAND wNotifyCode:0 (sent from a menu) wID: 57603

Pero igual, no me dio resultado el codigo mio:

Código PHP:
Private Const WM_COMMAND = &H111

    
Private Sub Button1_Click(ByVal sender As System.ObjectByVal e As System.EventArgsHandles Button1.Click
        Dim wParam 
As Long
        Dim lParam 
As Long
        wParam 
57601 
        lParam 
0
        SendMessage
(Label1.TextWM_COMMANDwParamlParam)
    
End Sub 
El label es el hWnd, sera que he cometido algun error? Gracias de verdad.
  #15 (permalink)  
Antiguo 01/09/2008, 10:17
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
De acuerdo Respuesta: Visual Basic 2005: Usar SendMessage.

Bueno, prueba con esto:
Código PHP:
SendMessage(Label1.TextWM_COMMANDByVal wParamByVal lParam
Si aún así no funciona, mira en el Spy++ qué mensaje está recibiendo el Treat cuando ejecutas el SendMessage, si es igual al que se produce al hacer click en el menú.
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #16 (permalink)  
Antiguo 01/09/2008, 10:33
Avatar de moradazo  
Fecha de Ingreso: julio-2008
Ubicación: [email protected]
Mensajes: 355
Antigüedad: 15 años, 10 meses
Puntos: 2
Respuesta: Visual Basic 2005: Usar SendMessage.

Dos cosas:

Los ByVal en los parámetros de Sendmessage me da un error que dice Expression expected. Lo completé con As Long pero tampoco me funciono, supongo que devolverá valores pero no se donde para serte sincero.

y lo del mensaje para comparar al darle clic al menu este fue el resultado:



hice el mismo procedimiento que me dijiste y en el cuadro blanco del Spy++ no mostro resultados al darle clic. Con el otro programa, serian los resultados que puse en el post numero 12

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

¿Al hacer click en el botón no está mostrando ningún mensaje en el Spy++?. Entonces significa que no estás obteniendo el hWnd correcto. .

Lo del ByVal es código de Visual Basic, permite obligar instanciar la variable, ya que SendMessage trabaja con punteros.
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #18 (permalink)  
Antiguo 01/09/2008, 11:27
Avatar de moradazo  
Fecha de Ingreso: julio-2008
Ubicación: [email protected]
Mensajes: 355
Antigüedad: 15 años, 10 meses
Puntos: 2
Respuesta: Visual Basic 2005: Usar SendMessage.

Perdona David no te habia entendido. Me pediste que hiciera el escaneo del sendmessage en el boton de mi form donde ejecuto el Sendmessage, cierto? eso no lo habia hecho, pensé que era otra cosa. Este es el resultado:



Si vieras, ese cuadro era como ver un For infinito, no paraba de llenarse, ya llevaba 1324 WM_Commands y no se detenía. Por ahi puede ser que esté el error, viéndolo bien parece que se están dando varios hWnd en el mismo momento (corrígeme si me equivoco).

Que puede ser?
Gracias.
  #19 (permalink)  
Antiguo 01/09/2008, 11:34
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
De acuerdo Respuesta: Visual Basic 2005: Usar SendMessage.

Prueba usando esta declaración para el SendMessage:
Código:
<System.Runtime.InteropServices.DllImport("user32.DLL")> _
Private Shared Function SendMessage( _
        ByVal hWnd As System.IntPtr, ByVal wMsg As Integer, _
        ByVal wParam As Integer, ByVal lParam As Integer _
        ) As Integer
End Sub
Aquí una página interesante para las equivalencias API:
http://www.elguille.info/NET/vb6anet...lenciasAPI.htm
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #20 (permalink)  
Antiguo 01/09/2008, 11:51
 
Fecha de Ingreso: enero-2007
Ubicación: Tingo María - Perú
Mensajes: 399
Antigüedad: 17 años, 3 meses
Puntos: 13
Respuesta: Visual Basic 2005: Usar SendMessage.

Haber, haber... algun tiempo atras hice lo mismo desde VB6.0, pero he aqui un ejemplo de como hacerlo desde VB.NET 2005:
Código:
Private Declare Ansi Function SendMessage Lib"user32.dll"Alias"SendMessageA" (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As String) As Integer
Private Declare Function FindWindow Lib"user32.dll"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 GetMenu Lib"user32"Alias"GetMenu" (ByVal hwnd As Integer) As Integer
Private Declare Function GetSubMenu Lib"user32"Alias"GetSubMenu" (ByVal hMenu As Integer, ByVal nPos As Integer) As Integer
Private Declare Function GetMenuItemID Lib"user32"Alias"GetMenuItemID" (ByVal hMenu As Integer, ByVal nPos As Integer) As Integer
Private Const WM_COMMAND = &H111
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim hwnd, hWndMenu, hWndSubMenu, MenuItem As Integer
hwnd = FindWindow("Notepad", vbNullString)
hWndMenu = GetMenu(hwnd)
hWndSubMenu = GetSubMenu(hWndMenu, 0)
MenuItem = GetMenuItemID(hWndSubMenu, 1)
SendMessage(hwnd, WM_COMMAND, MenuItem, vbNullString)
End Sub 
Nota: tener abierto el block de notas
__________________
Vivir para ser buenos y ser buenos para servir mejor.
  #21 (permalink)  
Antiguo 01/09/2008, 13:56
Avatar de moradazo  
Fecha de Ingreso: julio-2008
Ubicación: [email protected]
Mensajes: 355
Antigüedad: 15 años, 10 meses
Puntos: 2
Respuesta: Visual Basic 2005: Usar SendMessage.

Código:
<System.Runtime.InteropServices.DllImport("user32.DLL")> _
Private Shared Function SendMessage( _
        ByVal hWnd As System.IntPtr, ByVal wMsg As Integer, _
        ByVal wParam As Integer, ByVal lParam As Integer _
        ) As Integer
End Sub
Gracias David ahora si me resulta de maravilla sera por el System.IntPtr que esta declarado el hWnd. Gracias por la página de API's está bien interesante.

Ahora pues tengo otro pequeño problema: Cuando SendMessage hace clic en menú y luego en Save, el programa siempre va desplegar la siguiente imagen:



Ahora estuve probando con keybd_event pues esa ventana queda como la única activa ya que el mismo programa lo envía así. Por tanto si es la única activa debe funcionar este evento, pero no lo hace, incluso me doy cuenta que lo hace hasta que yo manualmente quito ese cuadro.

Habrá alguna manera que pueda quitar ese cuadro con con los keybd_event? (indicándolo que presione flecha derecha y luego ENTER)
  #22 (permalink)  
Antiguo 01/09/2008, 14:21
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
Exclamación Respuesta: Visual Basic 2005: Usar SendMessage.

Sí, se puede con keybd_event aunque da igual porque al final la ventana activa tendrá que ser esa.

Con SendMessage se podría hacer pero habría que obtener el hWnd de esa otra ventana.
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #23 (permalink)  
Antiguo 01/09/2008, 14:31
Avatar de moradazo  
Fecha de Ingreso: julio-2008
Ubicación: [email protected]
Mensajes: 355
Antigüedad: 15 años, 10 meses
Puntos: 2
Respuesta: Visual Basic 2005: Usar SendMessage.

Exactamente pensé en el SendMessage para esa otra ventana pero igual con keybd_event también probé y no muestra resultados. Pienso que el sendmessage terminará su función hasta que salve, o sea, en el código no se mueve de esa línea, no se si estaré equivocado, por eso veo que Flecha derecha y ENTER del keybd_event, funcionan hasta despues de que yo manualmente le doy Save Now como dice en el mensaje. me entiendes?
  #24 (permalink)  
Antiguo 01/09/2008, 14:37
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
Exclamación Respuesta: Visual Basic 2005: Usar SendMessage.

Exacto, el SendMessage no retorna el comando a la aplicación hasta que el mensaje haya sido procesado. Para que retorne inmediatamente deberías usar SendMessageCallback o SendNotifyMessage.
http://msdn.microsoft.com/en-us/library/ms644951(VS.85).aspx
http://msdn.microsoft.com/en-us/libr...53(VS.85).aspx
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #25 (permalink)  
Antiguo 01/09/2008, 14:41
Avatar de moradazo  
Fecha de Ingreso: julio-2008
Ubicación: [email protected]
Mensajes: 355
Antigüedad: 15 años, 10 meses
Puntos: 2
Respuesta: Visual Basic 2005: Usar SendMessage.

Ok gracias revisare los links, pura vida!
  #26 (permalink)  
Antiguo 01/09/2008, 15:48
Avatar de moradazo  
Fecha de Ingreso: julio-2008
Ubicación: [email protected]
Mensajes: 355
Antigüedad: 15 años, 10 meses
Puntos: 2
Respuesta: Visual Basic 2005: Usar SendMessage.

Mira hice esto:

Código PHP:
Dim hwnd As Integer
        hwnd 
FindWindow(Nothing"Reprox Warning")
        
SetActiveWindow(hwnd)
        
SetForegroundWindow(hwnd)
        
keybd_event(VK_RIGHT100)
        
keybd_event(VK_RIGHT1KEYEVENTF_KEYUP0)
        
keybd_event(VK_SPACE100)
        
keybd_event(VK_SPACE1KEYEVENTF_KEYUP0
Tomé el hWnd de la ventana esa que te mostré, y la puse activa y de frente para que así me funcione el SetActiveWindow y SetForegroundWindow. Todo lo hace bien, incluso minimizado, pero lo hace siempre y cuando la ventana minimizada este activa, es decir, que no tenga otra ventana activa. Si tuviera otra ventana, no hace lo del keybd_event. Que podra ser?
  #27 (permalink)  
Antiguo 02/09/2008, 06:26
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
De acuerdo Respuesta: Visual Basic 2005: Usar SendMessage.

Creo que cuando está minimizado deberías hacer lo del ShowWindow .

Aunque si ya estás obteniendo el hWnd es más fácil usar SendMessage para lo que necesitas.
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #28 (permalink)  
Antiguo 02/09/2008, 06:45
Avatar de moradazo  
Fecha de Ingreso: julio-2008
Ubicación: [email protected]
Mensajes: 355
Antigüedad: 15 años, 10 meses
Puntos: 2
Respuesta: Visual Basic 2005: Usar SendMessage.

Que tal David.

Resulta que el hWnd si lo obtengo, pero al usar el Spy++ para el wparam ID no me da un resultado correcto, pienso eso, mira:



cuando le doy clic derecho y luego propiedades, me dice que:
wparam: 00000401
lparam: 01C80550

Será que WM_Command no es para botones como en este caso o bien alguna otra situación? Estoy probando Sendmessage
  #29 (permalink)  
Antiguo 02/09/2008, 07:07
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
De acuerdo Respuesta: Visual Basic 2005: Usar SendMessage.

Sí, WM_COMMAND también serviría para botones en el caso de muchas ventanas toman ese mensaje para realizar la acción.

Fíjate que lParam en este caso es el hWnd del botón, por lo tanto, ese hWnd deberías obtenerlo por código (FindWindowEx). Si lo logras, me avisas y te digo cómo sería el resto.
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #30 (permalink)  
Antiguo 02/09/2008, 07:25
Avatar de moradazo  
Fecha de Ingreso: julio-2008
Ubicación: [email protected]
Mensajes: 355
Antigüedad: 15 años, 10 meses
Puntos: 2
Respuesta: Visual Basic 2005: Usar SendMessage.

Mira encontré esto:

Declaración

Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long

Descripción
La función busca entre las ventanas hijas de la ventana especificada, una cuya clase y nombre cumplan las condiciones especificadas.

Parámetros

hWndParentA Manejador de la ventana madre de la que buscamos sus ventanas hijas. Si ponemos 0, consideramos el escritorio como ventana madre y se buscarán todas las ventanas de nivel superior que son las hijas del escritorio.

hWndChildAfterA
Manejador de la ventana hija a partir de la cual comienza la busqueda. La busqueda comienza con la busqueda de la ventana hija inmediata en el Z-order. Si ponemos 0, la busqueda comienza con la ventana hija que esta de primera en el Z-order.

lpszClass Nombre de clase de la ventana que buscamos. Indicar una cadena nula para ignorar la clase.

lpszWindow Texto de la barra de titulo de la ventana buscada. Poner una cadena nula para ignorar el título de la ventana.


Debido a esto hice el siguiente código:

FindWindowEx(Label1.Text, hwnd, vbNullString, "Reprox Warning")

Donde...

Label1.Text es el hwnd madre
hwnd es el hwnd hijo
vbnullstring es el class hijo (que se puede ignorar)
"Reprox Warning" es el título de la ventana.

Valor devuelto
Si encuentra una ventana hija devuelve el manipulador de la misma; sino, devuelve 0.


Bueno, efectivamente me devolvió un cero, será que ando perdido en algo?
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 02:57.