Los foros del Guille

Si no encuentras respuesta, puedes buscar en el sitio del Guille

Google
 

MKN Reservas (Maro - Kayak Nerja)


Kayak Maro - Rutas y alquiler de kayak y tabla
Selecciona el foro y pulsa en mostrar:     Mostrar 
De tu inter�s (algunos de los avisos publicados)

01/feb./2019

Los moderadores, MVP y administradores podrán seguir editando, respondiendo o creando nuevos mensajes

Con idea de que puedan ayudar a responder e ir cerrando mensajes ;-)

  Foro: .NET VB Cantidad:  Desde:   Hasta:    Aplicar   Responder 
Respuestas a: 42407 - WM_KEYDOWN = Caca
IDAsuntoFechaNick 
42407 WM_KEYDOWN = Caca01/07/08 13:19angel_debat   
Hola.
Mi nombre es Àngel.
He hecho una pequeña aplicación para pasarle pulsaciones de teclas a un programa que esté en memoria sin necesidad que esté su ventana activa, (mediante el handler)
No funciona.
Alguien sabe si el WM_KEYDOWN funciona en .Net?

He escrito un código que detecta si una aplicación está en memória, captura su handler y puede enviarle un SendMessage(Handler, WM_CLOSE...
y cerrarlo pero no consigo pasarle ninguna tecla con WM_KEYDOWN.

Aquí os pongo el código. Si pudierais cdecirme donde falla os lo agradecería.

(Creo que os puede interesar porque es muy útil)


Imports System.Diagnostics
Module Module1
#Region "Declaraciones al API
     Para saber si una aplicación está en memoria "
    '
    <System.Runtime.InteropServices.DllImport("user32.dll", _
            EntryPoint:="SetForegroundWindow")> _
    Public Function SetForegroundWindow( _
            ByVal hWnd As IntPtr) As Boolean
    End Function
    '
    '
    <System.Runtime.InteropServices.DllImport("user32.dll", _
            EntryPoint:="FindWindow")> _
    Public Function FindWindow( _
            ByVal lpClassName As String, _
            ByVal lpWindowName As String) As IntPtr
    End Function
    '
    Public ceroIntPtr As New IntPtr(0)
    '
    '
#End Region

#Region "Declaraciones al API Para enviar un mensaje a otra aplicación "
    <System.Runtime.InteropServices.DllImport("user32.DLL")> _
    Public Function SendMessage( _
        ByVal hWnd As
             System.IntPtr, ByVal wMsg As Integer, _
        ByVal wParam As
             Integer, ByVal
             lParam As Integer _
            
        ) As Integer


    End Function

    Public Const WM_CLOSE = &H10    '16 EN DECIMAL
    Public Const WM_KEYDOWN = &H100
    Public Const WM_KEYUP = &H101

    Public Const VK_A = &H41
#End Region


    Public Sub Main()
        ' Se comprueba si la aplicación está en memoria
        Dim nWnd As IntPtr

        'Busca el Handless de la ventana del Bloc de notas
        nWnd = FindWindow(Nothing, "Sin título - Bloc de notas")

        If nWnd.Equals(ceroIntPtr) Then
            ' Si no está en memoria...
            Exit Sub
        End If

        '' Si está, activa su ventana
        'SetForegroundWindow(nWnd)      'FUNCIONA

        '' Si está, enviale un mensaje que la cierre:
        'SendMessage(nWnd, WM_CLOSE, 0&, 0&)      'FUNCIONA
        'SendMessage(nWnd, 16, 0, 0)      'FUNCIONA

        'Si está, enviale un mensaje que pulse la tecla A:
        SendMessage(nWnd, WM_KEYDOWN, VK_A, 0)      'NO FUNCIONA
        SendMessage(nWnd, WM_KEYUP, VK_A, 0)      'NO FUNCIONA


        'Si está, enviale un mensaje que PULSE TODAS LAS TECLAS UNA POR UNA:
        Dim i As Integer
        Do While i < 222
            i = i + 1
            SendMessage(nWnd, WM_KEYDOWN, i, 0)
            SendMessage(nWnd, WM_KEYUP, i, 0)
        Loop      'NO FUNCIONA

        ' y se sale de la actual
        Application.Exit()
    End Sub
End Module
[Editado: angel_debat, 04/07/2008 11:37:41]
IDAsuntoFechaNick 
42640 Re: WM_KEYDOWN = Caca (Resp: 42407)10/07/08 19:25elGuille [MVP]   
Eso no te funciona porque no estás mandando esa pulsación a la ventana en la que se escribe, sino a la ventana principal.
Para que lo entiendas mejor.
Si escribes esto lo que hará es cambiar el texto del título de la ventana pero no escribe "dentro" de la ventana.

' Esto lo debes añadir en las declaraciones
<System.Runtime.InteropServices.DllImport("user32.DLL")> _
Public Function SendMessage( _
    ByVal hWnd As
         System.IntPtr, ByVal wMsg As Integer, _
    ByVal wParam As Integer, ByVal lParam
         As String _
    ) As Integer
End Function

Private Const WM_SETTEXT As Integer = &HCS

' Esto en el Sub Main
' Esto cambia el título de la ventana
SendMessage(nWnd, WM_SETTEXT, 0, "Hola, Mundo" & ChrW(0))

Si quieres hacer algo en la caja de textos del bloc de notas, tendrás que averiguar el handle de esa ventana (todo en Windows son ventanas o casi)
Para saber esas ventanas hijas puedes usar EnumChildWindows.
Aquí tienes más info:
http://www.elguille.info/NET/vb6anet/equivalenciasAPI.htm#equivEnumChildWindows

   elGuille


Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias.
IDAsuntoFechaNick 
42663 Re: WM_KEYDOWN = Caca (Resp: 42640)11/07/08 12:05angel_debat   
Ostras... el capo.

Un placer conocerte.

Verás, el problema es que no quiero enviar un texto sino pulsaciones de teclas.

Tengo un cliente que quería obtener la imagen de un gráfico en jpg de unos valores guardados en un txt que cambian cada dos minutos.

Para ello, me dijo que utilizase el programa Autosignal. Desgraciadamente cuando hablé con los propietarios del programa para que me pasasen alguna dll con la que poder comunicarme con el, se desentendieron. Mi única solución consiste en manipular la aplicación con el teclado enviandole SendKeys.

Primero capturo el Handle de la aplicación. http://www.elguille.info/NET/vb6anet/capturarTextoVentanaActiva.htm

Después activo la ventana “x”:
http://www.elguille.info/NET/dotnet/previnstance.htm

Después, le envío SendKeys.Send("xxxxxxx")
Con todas las combinaciones de teclas necesarias: Alt + F4 para salir, Ctl + X para abrir el txt...

Funciona a la perfección, incluso capturo las pantallas de los gráficos y los muestro en una Web interna que se actualiza cada minuto...

Pero claro... Para que el engendro funcione, el programa ha de estar en la ventana activa, lo cual me anula por completo el pc en el que se lleva a cabo cada minuto.

Mi reto ahora, era atacar el AutoSignal no mediante SendKeys, que atacan la ventana activa, sino mediante SendMessage(Handles, WM_KEYDOWN, "Tecla Tal", 0)

Que yo esperaba que haría lo mismo que el SendKeys, pero de momento no hace nada.

El código que puse era un ejemplo para enviar pulsaciones de teclas al Notepad sin que estubiera activo.

Mediante el SendMessage, he conseguido cerrar el Notepad, (WM_CLOSE) He conseguido escribir un texto, (WM_SETTEXT)
Pero no hay manera de enviarle una pulsación de tecla...

No será que el WM_KEYDOWN no sirve para eso?


Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias.
IDAsuntoFechaNick 
42803 Re: WM_KEYDOWN = Caca (Resp: 42640)16/07/08 09:46angel_debat   
Siguiendo tus instrucciones, he utilizado la aplicación que hay en esa dirección para ver las ventanas hijas del block de notas y no me aparece ninguna.
Hay algún otro método para averiguar el Handle de la caja de textos del Block de notas?


Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias.
IDAsuntoFechaNick 
42920 Re: WM_KEYDOWN = Caca (Resp: 42640)21/07/08 11:38angel_debat   
He ido más allá.

He hecho otro proyecto para comprobar si, efectivamente el Notepad recibía los MESSAGES que le envío:

'Recoge todos los Messages que recibe esta ventana.
'Fijémonos en que no se ha de declarar Private Declare Function
     PostMessage, porque, de alguna manera, ya está declarada en alguna clase de la que cuelga
     la nuestra...
Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
    If m.Msg = WM_KEYDOWN Then
        TextBox1.Text &= m.WParam.ToString & ", "
        MyBase.WndProc(m)
    ElseIf m.Msg = WM_KEYUP Then
        TextBox2.Text &= m.WParam.ToString & ", "
        MyBase.WndProc(m)
    ElseIf m.Msg = WM_CLOSE Then
        TextBox3.Text = "CERRAR" & ", "
        MyBase.WndProc(m)
    Else
        MyBase.WndProc(m)
    End If
    'Esta función demuestra que nuestro formulario envía los
         mensages WM_KEYDOWN, WM_KEYUP igual que WM_CLOSE y que la ventana los recibe.
    'Pero no causan el efecto esperado: Que se produzca el
         evento "pulsar las teclas"
End Sub

Private Sub Form2_Load(ByVal sender As
     System.Object, ByVal e As
     System.EventArgs) Handles MyBase.Load
    Me.Text = "Sin título - Bloc de notas"
End Sub


La respuesta es que si.

Recibe los WM_KEYDOWN, aparecen los valores de cada uno en los textbox indicados.

Pero no se pulsa ninguna tecla.

No será que WM_KEYDOWN no sirve Para esto?


Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias.
IDAsuntoFechaNick 
43973 Re: WM_KEYDOWN = Caca (Resp: 42920)07/09/08 09:14Mario64   
Hello.
Existe otro evento que viene siendo WM_KEYPRESS
¿Has probado a usar este?

Suerte con el engendro guinio


Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias.
IDAsuntoFechaNick 
44023 Re: WM_KEYDOWN = Caca (Resp: 43973)09/09/08 08:22angel_debat   
Muchas gracias.

Lo pruebo y te digo...

Angel


Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias.
IDAsuntoFechaNick 
44025 Re: WM_KEYDOWN = Caca (Resp: 43973)09/09/08 09:53angel_debat   
Hola Mario.

No ha habido manera de encontrar el valor Hex de la constante WM_KEYPRESS. En unos sitios he visto que le daban el &H101, en otros el &H102...

Todos los que me daban ya estaban ocupados por constantes que ya he probado...

La lista de constantes que uso es:

#Region " Constantes de SendMessage:"

'Constantes de SendMessage:
Public Const WM_CLOSE = &H10 '16 EN DECIMAL
Public Const WM_KEYDOWN = &H100
Public Const WM_KEYUP = &H101
Public Const WM_SETTEXT = &HC
Public Const WM_GETTEXT = &HD
Public Const WM_GETTEXTLENGTH = &HE
Public Const WM_CHAR = &H102
Public Const WM_COMMAND = &H111
Private Const GW_HWNDFIRST = 0&
Private Const GW_HWNDNEXT = 2&
Private Const GW_CHILD = 5&
Public Const GWL_HWNDPARENT = (-rie_gafas

Public Const VK_LBUTTON = &H1
Public Const VK_RBUTTON = &H2
Public Const VK_CTRLBREAK = &H3
Public Const VK_MBUTTON = &H4
Public Const VK_BACKSPACE = &H8
Public Const VK_TAB = &H9
Public Const VK_ENTER = &HD
Public Const VK_SHIFT = &H10
Public Const VK_CONTROL = &H11
Public Const VK_ALT = &H12
Public Const VK_PAUSE = &H13
Public Const VK_CAPSLOCK = &H14
Public Const VK_ESCAPE = &H1B
Public Const VK_SPACE = &H20
Public Const VK_PAGEUP = &H21
Public Const VK_PAGEDOWN = &H22
Public Const VK_END = &H23
Public Const VK_HOME = &H24
Public Const VK_LEFT = &H25
Public Const VK_UP = &H26
Public Const VK_RIGHT = &H27
Public Const VK_DOWN = &H28
Public Const VK_PRINTSCREEN = &H2C
Public Const VK_INSERT = &H2D
Public Const VK_DELETE = &H2E
Public Const VK_0 = &H30
Public Const VK_1 = &H31
Public Const VK_2 = &H32
Public Const VK_3 = &H33
Public Const VK_4 = &H34
Public Const VK_5 = &H35
Public Const VK_6 = &H36
Public Const VK_7 = &H37
Public Const VK_8 = &H38
Public Const VK_9 = &H39
Public Const VK_A = &H41
Public Const VK_B = &H42
Public Const VK_C = &H43
Public Const VK_D = &H44
Public Const VK_E = &H45
Public Const VK_F = &H46
Public Const VK_G = &H47
Public Const VK_H = &H48
Public Const VK_I = &H49
Public Const VK_J = &H4A
Public Const VK_K = &H4B
Public Const VK_L = &H4C
Public Const VK_M = &H4D
Public Const VK_n = &H4E
Public Const VK_O = &H4F
Public Const VK_P = &H50
Public Const VK_Q = &H51
Public Const VK_R = &H52
Public Const VK_S = &H53
Public Const VK_T = &H54
Public Const VK_U = &H55
Public Const VK_V = &H56
Public Const VK_W = &H57
Public Const VK_X = &H58
Public Const VK_Y = &H59
Public Const VK_Z = &H5A
Public Const VK_LWINDOWS = &H5B
Public Const VK_RWINDOWS = &H5C
Public Const VK_APPSPOPUP = &H5D
Public Const VK_NUMPAD_0 = &H60
Public Const VK_NUMPAD_1 = &H61
Public Const VK_NUMPAD_2 = &H62
Public Const VK_NUMPAD_3 = &H63
Public Const VK_NUMPAD_4 = &H64
Public Const VK_NUMPAD_5 = &H65
Public Const VK_NUMPAD_6 = &H66
Public Const VK_NUMPAD_7 = &H67
Public Const VK_NUMPAD_8 = &H68
Public Const VK_NUMPAD_9 = &H69
Public Const VK_NUMPAD_MULTIPLY = &H6A
Public Const VK_NUMPAD_ADD = &H6B
Public Const VK_NUMPAD_PLUS = &H6B
Public Const VK_NUMPAD_SUBTRACT = &H6D
Public Const VK_NUMPAD_MINUS = &H6D
Public Const VK_NUMPAD_MOINS = &H6D
Public Const VK_NUMPAD_DECIMAL = &H6E
Public C


Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias.
IDAsuntoFechaNick 
44159 Re: WM_KEYDOWN = Caca (Resp: 42407)14/09/08 15:05jomabova   
Hola.

Hacia tiempo que no venia por aquí. Ahora que estoy de visita me encuentro que sigues dándole a lo de las teclas. Llegarás lejos, pues eres muy constante.

Quiza si entras en este enlace Ejemplo de Send Keys. puedas resolver el problema, al menos te servirá de ayuda para eso y otras muchas cosas. Si no puedes bajarlo, basta con que te des de alta. Es un sitio muy bueno para programadores.

Saludos y hasta otra.


Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias.
IDAsuntoFechaNick 
44165 Re: WM_KEYDOWN = Caca (Resp: 44159)15/09/08 10:53angel_debat   
Hola Jomabova. Que tal?

Pues sí... Aquí estoy aun, empujando...

Como ya te contesté en uno de mis primeros Post:

http://foros.elguille.info/Mensajes.aspx?ID=40924

Gracias a tus pistas, conseguí comunicarme con la aplicación en cuestión gracias a SendKeys.

Todo va bien. El problema es que, para que funcione SendKeys, la ventana activa debe ser la de la aplicación a la que envías las pulsaciones de teclas. Eso limita mucho la máquina en la que se utiliza el programa.

Mirando por Internet, descubrí que había otra función, "SendMessage" a la que, si le pasas el Hendless de la ventana que quieres, puedes enviarle teclas sin que esta esté activa.

De momento, he conseguido:

Mediante SendMessage(hwnd_box, WM_KEYDOWN, VK_DOWN, 0) he conseguido que me pulse algunas teclas, (solo las flechas y delete)

Mediante SendMessage(hwnd_box, WM_IME_KEYDOWN, VK_A, 0)he conseguido que me pulse algunas otras teclas, (solo números y letras)

Pero, de momento, no he conseguido enviar Alt, ni Control, ni F4…

Sigo con ello.

Te adjunto la aplicación que utilizo para hacer pruebas, por si le quieres echar un vistazo, o por si te puede servir para algo…




Public Class Form2
Inherits System.Windows.Forms.Form

'Le pasas el Caption de una ventana y te devuelve el Handless en forma de Integer
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Integer


'Necesaria para WM_SETTEXT
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

'Envía un Mensaje a la ventana que tenga el Handless hwnd As Integer
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
(ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, _
ByVal lParam As String) As Integer



#Region " Algunas Constantes de SendMessage:"

Public Const WM_SYSKEYDOWN = &H104
Public Const WM_SYSKEYUP = &H105 '?????
Public Const WM_IME_KEYDOWN = &H290
Public Const WM_IME_KEYUP = &H291
Public Const WM_CLOSE = &H10 '16 EN DECIMAL
Public Const WM_KEYDOWN = &H100
Public Const WM_KEYUP = &H101
Public Const WM_SETTEXT = &HC
Public Const WM_CHAR = &H102
Public Const WM_COMMAND = &H111
Private Const GW_HWNDFIRST = 0&
Private Const GW_HWNDNEXT = 2&
Private Const GW_CHILD = 5&
Public Const GWL_HWNDPARENT = (-rie_gafas

Public Const VK_MENU = &H12

Public Const VK_TAB = &H9
Public Const VK_ENTER = &HD
Public Const VK_SHIFT = &H10
Public Const VK_CONTROL = &H11
Public Const VK_ALT = &H12
Public Const VK_LEFT = &H25
Public Const VK_UP = &H26
Public Const VK_RIGHT = &H27
Public Const VK_DOWN = &H28
Public Const VK_PRINTSCREEN = &H2C
Public Const VK_DELETE = &H2E
Public Const VK_0 = &H30
Public Const VK_1 = &H31
Public Const VK_2 = &H32
Public Const VK_3 = &H33
Public Const VK_4 = &H34
Public Const VK_5 = &H35
Public Const VK_6 = &H36
Public Const VK_7 = &H37
Public Const VK_8 = &H38
Public Const VK_9 = &H39
Public Const VK_A = &H41
Public Const VK_B = &H42
Public Const VK_C = &H43
Public Const VK_P = &H50
Public Const VK_F1 = &H70
Public Const VK_F2 = &H71
Public Const VK_F3 = &H72
Public Const VK_F4 = &H73
Public Const VK_F5 = &H74
Publi


Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias.
IDAsuntoFechaNick 
44166 Re: WM_KEYDOWN = Caca (Resp: 44165)15/09/08 11:00angel_debat   


'...CONTINUACION:
Public Const VK_F4 = &H73
Public Const VK_F5 = &H74
Public Const VK_F6 = &H75

#End Region


'...





Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim whwnd As Integer

Dim hwnd_box As Integer

Dim comment As String

comment = TextBox1.Text

'PREVIAMENTE, DEBES ABRIR UNA VENTANA CON EL NOTEPAD:

whwnd = FindWindow(Nothing, "Sin título - Bloc de notas")

hwnd_box = FindWindowEx(whwnd, 0, vbNullString, vbNullString) 'Esto no tengo claro para que sirve, pero si no lo utilizo, no puedo usar, por ejemplo WM_SETTEXT


If whwnd <> 0 Then
'DESCOMENTA LO QUE QUIERAS PROBAR:
'DONDE PONGO QUE NO FUNCIONA, ES QUE, A MI, NO ME HA FUNCIONADO. SI QUIERES, PRUEBA TU, TAL VEZ DEPENDA DEL PC

' SendMessage(hwnd_box, WM_SETTEXT, 0, 1) 'FUNCIONA
' SendMessage(hwnd_box, WM_SETTEXT, 0, VK_A) 'FUNCIONA

' ESCRIBIR PRIMERO EN NOTEPAD:
' 1
' 2
' 3

' Y SELECCIONAR EL 2
'SendMessage(hwnd_box, WM_KEYDOWN, VK_DOWN, 0) 'FUNCIONA
'SendMessage(hwnd_box, WM_KEYUP, VK_DOWN, 0) 'FUNCIONA

' SendMessage(whwnd, WM_KEYDOWN, VK_DOWN, 0) 'NO FUNCIONA
' SendMessage(whwnd, WM_KEYUP, VK_DOWN, 0) 'NO FUNCIONA

' SendMessage(hwnd_box, WM_KEYDOWN, VK_DELETE, 0) 'FUNCIONA
' SendMessage(hwnd_box, WM_KEYUP, VK_DELETE, 0) 'FUNCIONA

' SendMessage(hwnd_box, WM_KEYDOWN, VK_A, 0) 'NO FUNCIONA
' SendMessage(hwnd_box, WM_KEYUP, VK_A, 0) 'NO FUNCIONA

' SendMessage(hwnd_box, WM_KEYDOWN, VK_ALT, 0) 'NO FUNCIONA
' SendMessage(hwnd_box, WM_KEYDOWN, VK_F4, 0) 'NO FUNCIONA
' SendMessage(hwnd_box, WM_KEYUP, VK_F4, 0) 'NO FUNCIONA
' SendMessage(hwnd_box, WM_KEYUP, VK_ALT, 0) 'NO FUNCIONA

' SendMessage(hwnd_box, WM_IME_KEYDOWN, VK_DOWN, 0) 'FUNCIONA
SendMessage(hwnd_box, WM_IME_KEYDOWN, VK_A, 0) 'FUNCIONA
' SendMessage(hwnd_box, WM_IME_KEYUP, VK_A, 0) 'FUNCIONA Raro, pulsa dos veces

' SendMessage(whwnd, WM_IME_KEYDOWN, VK_A, 0) 'NO FUNCIONA
' SendMessage(whwnd, WM_IME_KEYUP, VK_A, 0) 'NO FUNCIONA

' SendMessage(hwnd_box, WM_KEYDOWN, VK_SHIFT, 0) 'NO FUNCIONA
' SendMessage(hwnd_box, WM_IME_KEYDOWN, VK_A, 0) 'CON LO DE ARRIBA NO FUNCIONA

' SendMessage(hwnd_box, WM_IME_KEYDOWN, VK_TAB, 0) 'FUNCIONA

' SendMessage(hwnd_box, WM_IME_KEYDOWN, VK_ALT, 0) 'NO FUNCIONA
' SendMessage(hwnd_box, WM_IME_KEYDOWN, VK_F4, 0) 'NO FUNCIONA
' SendMessage(hwnd_box, WM_IME_KEYUP, VK_F4, 0) 'NO FUNCIONA
' SendMessage(hwnd_box, WM_IME_KEYUP, VK_ALT, 0) 'NO FUNCIONA

' SendMessage(hwnd_box, WM_SYSKEYDOWN, VK_ALT, 0) 'NO FUNCIONA
' SendMessage(hwnd_box, WM_SYSKEYDOWN, VK_F4, 0) 'NO FUNCIONA
' SendMessage(hwnd_box, WM_SYSKEYUP, VK_F4, 0) 'NO FUNCIONA
' SendMessage(hwnd_box, WM_SYSKEYUP, VK_ALT, 0) 'NO FUNCIONA

' SendMessage(hwnd_box, WM_SYSKEYDOWN, VK_CONTROL, 0) 'NO FUNCIONA
' SendMessage(hwnd_box, WM_IME_KEYDOWN, VK_P, 0) 'CON LO DE ARRIBA NO FUNCIONA

' SendMessage(hwnd_box, WM_KEYDOWN, VK_CONTROL,


Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias.
IDAsuntoFechaNick 
44167 Re: WM_KEYDOWN = Caca (Resp: 44166)15/09/08 11:02angel_debat   
'...CONTINUACION:
            '            SendMessage(hwnd_box, WM_SYSKEYDOWN,
                 VK_ALT, 0) 'NO FUNCIONA
            '            SendMessage(hwnd_box, WM_SYSKEYDOWN,
                 VK_F4, 0) 'NO FUNCIONA
            '            SendMessage(hwnd_box, WM_SYSKEYUP, VK
                _F4, 0) 'NO FUNCIONA
            '            SendMessage(hwnd_box, WM_SYSKEYUP, VK
                _ALT, 0) 'NO FUNCIONA

            '            SendMessage(hwnd_box, WM_SYSKEYDOWN,
                 VK_CONTROL, 0) 'NO FUNCIONA
            '            SendMessage(hwnd_box, WM_IME_KEYDOWN,
                 VK_P, 0) 'CON LO DE ARRIBA NO FUNCIONA

            '            SendMessage(hwnd_box, WM_KEYDOWN, VK
                _CONTROL, 0) 'NO FUNCIONA
            '            SendMessage(hwnd_box, WM_IME_KEYDOWN,
                 VK_P, 0) 'CON LO DE ARRIBA NO FUNCIONA

        End If
    End Sub
End Class

Muchas gracias.


Àngel


Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias.
IDAsuntoFechaNick 
44170 Re: WM_KEYDOWN = Caca (Resp: 42407)15/09/08 11:24jomabova   
Hola Angel.

En el enlace que te puse hay un ejemplo muy potente de sendkys. Pruébalo y mira el fuente. También puedes hacer una búsqueda dentro de CodeProject de lo que te interesa, seguro que algún "chalao" ha desarrollado algo. No te imaginas la de problemas que he resuelto husmeando esa página.

En el otro post que tienes de "WM_KD" te puse un enlace al MSDN que te resultará útil. De todos modos usar el api a bajo nivel para interferir o comunicar programas no es nada fácil, sobre todo si el programa destino no es tuyo o no tienes acceso al fuente.

Una aproximación a la solución que pretendes, pero muy complicad, seria algo como esto:

Localizar los Handles de las ventanas que maneja la aplicación gráfica, al menos el principal, una vez conseguido obtener el WndProc de la rutina que gestiona los mensajes y redirigirla a una tuya. Si consigues eso, solo necesitas analizar los mensajes que recibes, si el Hwnd es de tu aplicación sigues normal, si es la invitada rediriges a la rutina original. Si eso va bien habrás superado lo peor, solo te queda montar los mensajes de las teclas y mandarlos a la rutina original.

Esto parece fácil pero no lo es, en cualquier caso puede servirte. Te irá bien entrar en esta página: MASM32. Si te bajas el SDK puedes obtener la libreria Windows.Inc, está en texto plano. Es un include para asm que tiene todos los valores o casi todos de las constantes de Windows. Otra herramienta que te hará falta si quieres profundizar en el api, es el SDK del Windows que está en Microsoft y es gratuito, una herramienta fundamental. Desde la página del Masm32 puedes acceder al foro (en inglés) y a la página de Icelion. Te sorprenderás lo que sabe la gente.

Bueno, espero que te sirva. Acuérdate de notificarme la respuesta caso de haberla.


Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias.

 
(c) Guillermo 'guille' Som, 2005-2026  - foros.elGuille v1.0.6.3 (01/Jun/2021 12:45 GMT +2)  - (ASP.NET v4.0.30319.42000)
 
La hora GMT del servidor es: 09/06/2026 15:17:24 GMT