| ID | Asunto | Fecha | Nick | |
| 42407 | WM_KEYDOWN = Caca | 01/07/08 13:19 | angel_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] |
|
| ID | Asunto | Fecha | Nick | |
| 42640 | Re: WM_KEYDOWN = Caca (Resp: 42407) | 10/07/08 19:25 | elGuille [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. |
|
| ID | Asunto | Fecha | Nick | |
| 42663 | Re: WM_KEYDOWN = Caca (Resp: 42640) | 11/07/08 12:05 | angel_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.htmDespués activo la ventana “x”: http://www.elguille.info/NET/dotnet/previnstance.htmDespué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. |
|
| ID | Asunto | Fecha | Nick | |
| 42803 | Re: WM_KEYDOWN = Caca (Resp: 42640) | 16/07/08 09:46 | angel_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. |
|
| ID | Asunto | Fecha | Nick | |
| 42920 | Re: WM_KEYDOWN = Caca (Resp: 42640) | 21/07/08 11:38 | angel_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. |
|
| ID | Asunto | Fecha | Nick | |
| 43973 | Re: WM_KEYDOWN = Caca (Resp: 42920) | 07/09/08 09:14 | Mario64 | | |
Hello. Existe otro evento que viene siendo WM_KEYPRESS ¿Has probado a usar este? Suerte con el engendro 
Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias. |
|
| ID | Asunto | Fecha | Nick | |
| 44023 | Re: WM_KEYDOWN = Caca (Resp: 43973) | 09/09/08 08:22 | angel_debat | | |
Muchas gracias.
Lo pruebo y te digo...
Angel
Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias. |
|
| ID | Asunto | Fecha | Nick | |
| 44025 | Re: WM_KEYDOWN = Caca (Resp: 43973) | 09/09/08 09:53 | angel_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 = (-
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. |
|
| ID | Asunto | Fecha | Nick | |
| 44159 | Re: WM_KEYDOWN = Caca (Resp: 42407) | 14/09/08 15:05 | jomabova | | |
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. |
|
| ID | Asunto | Fecha | Nick | |
| 44165 | Re: WM_KEYDOWN = Caca (Resp: 44159) | 15/09/08 10:53 | angel_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=40924Gracias 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 = (-
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. |
|
| ID | Asunto | Fecha | Nick | |
| 44166 | Re: WM_KEYDOWN = Caca (Resp: 44165) | 15/09/08 11:00 | angel_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. |
|
| ID | Asunto | Fecha | Nick | |
| 44167 | Re: WM_KEYDOWN = Caca (Resp: 44166) | 15/09/08 11:02 | angel_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 ClassMuchas gracias. Àngel
Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias. |
|
| ID | Asunto | Fecha | Nick | |
| 44170 | Re: WM_KEYDOWN = Caca (Resp: 42407) | 15/09/08 11:24 | jomabova | | |
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. |