elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  Simular Key Press !!
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Simular Key Press !!  (Leído 3,312 veces)
TrashAmbishion


Desconectado Desconectado

Mensajes: 756


Ver Perfil
Simular Key Press !!
« en: 21 Junio 2016, 07:39 am »

He probado varios codigos de la RED incluso el de Electro y no me funciona necesito simular que presiono la tecla F10, alguna idea mi sistema es Windows 8.1.

Codigo de Elektro

http://foro.elhacker.net/buscador-t413217.0.html

Probe este otro y nada

http://www.visual-basic-tutorials.com/223201022306.php

Es para hacer una captura de pantalla con el programa FRAP


En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.878



Ver Perfil
Re: Simular Key Press !!
« Respuesta #1 en: 21 Junio 2016, 09:57 am »

He probado varios codigos de la RED incluso el de Electro y no me funciona necesito simular que presiono la tecla F10, alguna idea mi sistema es Windows 8.1.

Codigo de Elektro

http://foro.elhacker.net/buscador-t413217.0.html

Hola.

El código que has citado no sirve para sintetizar pulsaciones de teclado, sino para enviar caracteres, por ende, no es posible utilizar las teclas especiales Fn. Aparte de eso, no está demasiado bien enfocada la implementación de los métodos, me refiero, la función que escribí se debería haber llamado SendChar en lugar de SendKey para evitar este tipo de confusión.

Para enviar pulsaciones del teclado la metodología es practicamente idéntica, solo que obviamente no hay que realizar ninguna conversión a caracter. Puedes tratar de modificar el código que publiqué para ignorar la conversión a caracter a ver si así funciona como esperas.

Te mostraría un ejemplo actualizado y completo pero son bastantes definiciones las que hay que usar y agrandaría demasiado (todavía más) esta respuesta, sin embargo, todo lo que necesitas lo puedes encontrar en la implementación que hice de RAW_INPUT en mi API ElektroKit, solo tienes que copiar y pegar los miembros relacionados entre sí:

Código
  1.        <SuppressUnmanagedCodeSecurity>
  2.        <DllImport("user32.dll", SetLastError:=True)>
  3.        Public Shared Function SendInput(ByVal nInputs As Integer,
  4. <MarshalAs(UnmanagedType.LPArray), [In]> ByVal pInputs As Input32(),
  5.                                         ByVal cbSize As Integer
  6.        ) As Integer
  7.        End Function
  8.  
  9.        <SuppressUnmanagedCodeSecurity>
  10.        <DllImport("user32.dll", SetLastError:=True)>
  11.        Public Shared Function SendInput(ByVal nInputs As Integer,
  12. <MarshalAs(UnmanagedType.LPArray), [In]> ByVal pInputs As Input64(),
  13.                                         ByVal cbSize As Integer
  14.        ) As Integer
  15.        End Function

+

( click en las imágenes para ir al código fuente )





( Además de las estructuras mencionadas, también necesitarás: Win32.Types.InputType, Win32.Types.MouseInput, Win32.Types.KeyboardInput y Win32.Types.HardwareInput )

+



 (Función: Keyboard.SendKey())

Nota:
La estructura Input está dividida en dos, una para ser utilizada bajo Windows x86, y la otra para Windows x64. Y a raíz de lo mencionado hay una condicional para utilizar una estructura o la otra en el bloque del método SendKey (entre otros). El motivo de todo esto es que en un principio se me dificultó la tarea de portabilizar la estructura, sin embargo, todo eso ya lo refactoricé y lo simplifiqué, pero el código que hay publicado en GitHub está desactualizado (de todas formas te funcionará correctamente. simplemente es un código feo o guarro por así decirlo).



Si te parece mucho lio todo lo de arriba, la alternativa sería compilar la librería y/o descargar la última release ya compilada desde GitHub, y entonces simplemente tienes que llamar a la función Elektro.Core.IO.Tools.Keyboard.SendKey().

Ejemplo de uso:
Código
  1. Imports Elektro.Core.IO.Enums
  2. Imports Elektro.Core.IO.Tools
  3.  
  4. Public NotInheritable Class Form1
  5.  
  6.    Private Sub Button1_Click() Handles Button1.Click
  7.  
  8.        Process.Start("proceso.exe")
  9.        Thread.Sleep(TimeSpan.FromSeconds(5))
  10.        Keyboard.SendKey(Keys.F10, KeyBehavior.Press)
  11.  
  12.    End Sub
  13.  
  14. End Class

Saludos


« Última modificación: 21 Junio 2016, 12:44 pm por Eleкtro » En línea



TrashAmbishion


Desconectado Desconectado

Mensajes: 756


Ver Perfil
Re: Simular Key Press !!
« Respuesta #2 en: 22 Junio 2016, 00:21 am »

Que tal Elektro gracias por tu pronta respuesta, bueno no estaba muy familiarizado con el GitHub ya (gracias a ti) toy un poco mas actualizado con el.

Bueno tome el ultimo ejemplo que pusistes y en esta linea

Código
  1.         Keyboard.SendKey(Keys.F10, KeyBehavior.Press)
  2.  

El KeyBehavior me lo sigue marcando como que no lo reconoce y para colmo perdi tu CHM mañana lo descargo.
En línea

okik


Desconectado Desconectado

Mensajes: 462


Ver Perfil
Re: Simular Key Press !!
« Respuesta #3 en: 22 Junio 2016, 02:30 am »

hola

MODO 1

USANDO SENDINPUT

Código
  1. Imports System.Security
  2. Imports System.Runtime.InteropServices
  3. Public Class Form1
  4.  
  5.    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  6.        Dim sInput As NativeMethods.INPUT
  7.        sInput.type = NativeMethods.INPUT_KEYBOARD
  8.        sInput.ki.wVk = Keys.F10
  9.        sInput.ki.dwFlags = 0
  10.  
  11.        NativeMethods.SendInput(1, sInput, Marshal.SizeOf(GetType(NativeMethods.INPUT)))
  12.    End Sub
  13. End Class
  14.  
  15.  
  16. <SuppressUnmanagedCodeSecurity()>
  17. Friend NotInheritable Class NativeMethods
  18.    Private Sub New()
  19.    End Sub
  20.  
  21.    <DllImport("user32.dll", CharSet:=CharSet.Auto)> _
  22.    Friend Shared Function SendInput(ByVal cInputs As Integer, ByRef pInputs As INPUT, ByVal cbSize As Integer) As Integer
  23.    End Function
  24.  
  25.    Structure MOUSEINPUT
  26.        Public dx As Integer
  27.        Public dy As Integer
  28.        Public mouseData As Integer
  29.        Public dwFlags As Integer
  30.        Public time As Integer
  31.        Public dwExtraInfo As IntPtr
  32.    End Structure
  33.  
  34.    Structure KEYBDINPUT
  35.        Public wVk As Short
  36.        Public wScan As Short
  37.        Public dwFlags As Integer
  38.        Public time As Integer
  39.        Public dwExtraInfo As IntPtr
  40.    End Structure
  41.    Structure HARDWAREINPUT
  42.        Public uMsg As Integer
  43.        Public wParamL As Short
  44.        Public wParamH As Short
  45.    End Structure
  46.  
  47.    <StructLayout(LayoutKind.Explicit)> _
  48.    Structure INPUT
  49.        <FieldOffset(0)> _
  50.        Public type As Integer
  51.        <FieldOffset(4)> _
  52.        Public mi As MOUSEINPUT
  53.        <FieldOffset(4)> _
  54.        Public ki As KEYBDINPUT
  55.        <FieldOffset(4)> _
  56.        Public hi As HARDWAREINPUT
  57.    End Structure
  58.  
  59.  
  60.    Public Const VK_H As Short = 72
  61.    Public Const VK_E As Short = 69
  62.    Public Const VK_L As Short = 76
  63.    Public Const VK_O As Short = 79
  64.  
  65.    Public Const KEYEVENTF_KEYUP As Integer = &H2
  66.    Public Const INPUT_MOUSE As Integer = 0
  67.    Public Const INPUT_KEYBOARD As Integer = 1
  68.    Public Const INPUT_HARDWARE As Integer = 2
  69.  
  70.  
  71. End Class
  72.  
  73.  



MODO 2

USANDO KEYBD_EVENT

Código
  1. Imports System.Security
  2. Imports System.Runtime.InteropServices
  3.  
  4. Public Class Form1
  5.  
  6.    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  7.        NativeMethods.keybd_event(Keys.F10, 0, 0, 0)
  8.        NativeMethods.keybd_event(Keys.F10, 0, NativeMethods.KeyEventFlags.KEYEVENTF_KEYUP, 0)
  9.    End Sub
  10. End Class
  11.  
  12. <SuppressUnmanagedCodeSecurity()>
  13. Friend NotInheritable Class NativeMethods
  14.    Private Sub New()
  15.    End Sub
  16.  
  17.    <DllImport("user32.dll", CharSet:=CharSet.Auto)> _
  18.    Friend Shared Sub keybd_event(ByVal bVk As Byte, _
  19.        ByVal bScan As Byte, _
  20.        ByVal dwFlags As Integer, _
  21.        ByVal dwExtraInfo As Integer)
  22.    End Sub
  23.  
  24.    <Flags()> _
  25.    Public Enum KeyEventFlags As UInteger
  26.        VK_NUMLOCK = &H90
  27.        VK_SCROLL = &H91
  28.        VK_CAPITAL = &H14
  29.        KEYEVENTF_EXTENDEDKEY = &H1
  30.        KEYEVENTF_KEYUP = &H2
  31.        VER_PLATFORM_WIN32_NT = 2
  32.        VER_PLATFORM_WIN32_WINDOWS = 1
  33.    End Enum
  34. End Class
  35.  
  36.  


Por ahí hay gente que aconseja usar SendInput, pero funciona en los dos casos. Por lo menos en mi OS, en el tuyo no se. Ambos usan User32.dll.
« Última modificación: 22 Junio 2016, 02:34 am por okik » En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.878



Ver Perfil
Re: Simular Key Press !!
« Respuesta #4 en: 22 Junio 2016, 07:25 am »

@okik

Hola.

Por ahí hay gente que aconseja usar SendInput

El problema con la función keybd_event, aparte de la limitada versatilidad que proporciona en comparación, es que está considerada obsoleta. Es una función muy, muy antigua, y esto significa que en cualquier momento podría desaparecer en la API de futuras versiones de Windows, y por ende, volverse incompatible con ciertas aplicaciones que sigan usando esta metodología (como ha ido sucediendo a lo largo de los años con otras funciones consideradas obsoletas).



funciona en los dos casos.

En realidad no, la definición que has compartido de SendInput solo funcionará bajo Windows/proceso de 32 Bits. No funcionará en Windows/proceso de 64 Bits.

La alineación de offsets que has definido es incorrecta, puesto que en Windows de 64 Bits la unión de miembros empezará en el byte 8, no 4.
Si usas la funcionalidad CA (Code Analysis) de Visual Studio, te advertirá de este problema diciéndote que los miembros de la estructura Input no son portables. O también puedes compilar el código bajo x64 (no AnyCPU/Preffer 32Bit) para comprobar que efectivamente no funciona, no se sintetizan las pulsaciones.

La solución a este problema es muy sencilla, simplemente los miembros de la estructura SendInput deben ser declarados de forma secuencial, no explícita. Aparte, debes mover las estructuras MOUSEINPUT, KEYBDINPUT, HARDWAREINPUT a una estructura diferente y entonces sí, alinear las posiciones de la unión de miembros de forma explícita.

Con el código que actualmente has compartido, esta sería la solución para portabilizar tu estructura Input:

Código
  1.    <StructLayout(LayoutKind.Sequential)>
  2.    Structure Input
  3.        Public Type As Integer
  4.        Public Info As InputInfo
  5.    End Structure
  6.  
  7.    <StructLayout(LayoutKind.Explicit)>
  8.    Structure InputInfo
  9.        <FieldOffset(0)>
  10.        Public Mi As MOUSEINPUT
  11.        <FieldOffset(0)>
  12.        Public Ki As KEYBDINPUT
  13.        <FieldOffset(0)>
  14.        Public Hi As HARDWAREINPUT
  15.    End Structure
  16.  
  17.    <StructLayout(LayoutKind.Sequential)>
  18.    Structure MouseInput
  19.        ' ...
  20.    End Structure
  21.  
  22.    <StructLayout(LayoutKind.Sequential)>
  23.    Structure KeyboardInput
  24.        ' ...
  25.    End Structure
  26.  
  27.    <StructLayout(LayoutKind.Sequential)>
  28.    Structure HardwareInput
  29.        ' ...
  30.    End Structure

Saludos
« Última modificación: 22 Junio 2016, 08:17 am por Eleкtro » En línea



TrashAmbishion


Desconectado Desconectado

Mensajes: 756


Ver Perfil
Re: Simular Key Press !!
« Respuesta #5 en: 23 Junio 2016, 18:56 pm »

Dios jajajaja  :o :o :o :o

Embullate da clases online... GGG

Bueno entre tanto y tanto el Metodo 2 me funciono no obstante probare el 1ero con los ajustes y comento.

PD: Mas me interesa poder hacer la captura de la imagen del juego sin necesidad de usar un programa externo que me haga esto, es el objetivo de este codigo. Que ya estoy cerca de resolver.

Salu2 y Graciasss
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Controlar Key press
Programación Visual Basic
TheGhost(Z) 7 7,835 Último mensaje 25 Febrero 2006, 13:36 pm
por TheGhost(Z)
key (press/down)
Programación Visual Basic
xXnewbieXx 5 3,018 Último mensaje 10 Junio 2006, 08:14 am
por Grimble Grumble
Nircmd. Porque no funciona nircmd.exe sendkey 0x2D press???
Scripting
morenochico 6 7,085 Último mensaje 2 Agosto 2009, 00:40 am
por leogtz
no bootable device insert boot disk and press any key "(SOLUCIONADO)"
Hardware
Charlieone 9 31,300 Último mensaje 21 Marzo 2013, 14:43 pm
por Charlieone
No ide master h.d.d. detected press f1 to resume ¿Solucion?
Hardware
victtor77 3 13,920 Último mensaje 19 Enero 2015, 21:46 pm
por knario
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines