Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Eleкtro

#3621
@okik

Hola.

Cita de: okik en 22 Junio 2016, 02:30 AMPor 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).




Cita de: okik en 22 Junio 2016, 02:30 AMfunciona 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 (vbnet) [Seleccionar]
   <StructLayout(LayoutKind.Sequential)>
   Structure Input
       Public Type As Integer
       Public Info As InputInfo
   End Structure

   <StructLayout(LayoutKind.Explicit)>
   Structure InputInfo
       <FieldOffset(0)>
       Public Mi As MOUSEINPUT
       <FieldOffset(0)>
       Public Ki As KEYBDINPUT
       <FieldOffset(0)>
       Public Hi As HARDWAREINPUT
   End Structure

   <StructLayout(LayoutKind.Sequential)>
   Structure MouseInput
       ' ...
   End Structure

   <StructLayout(LayoutKind.Sequential)>
   Structure KeyboardInput
       ' ...
   End Structure

   <StructLayout(LayoutKind.Sequential)>
   Structure HardwareInput
       ' ...
   End Structure


Saludos
#3622
Windows / Re: Crear windows desatendido
21 Junio 2016, 21:31 PM
Cita de: cristiansbd95 en 21 Junio 2016, 20:58 PM
Me sigue saliento este error.Adjunto imagen(El pantallazo es del segundo windows 10 instalado).


https://drive.google.com/open?id=0B1TTm5KcFQobVXZYTFoydUNXVXc

Al parecer se está tomando el "10" entre el espacio de "windows" y "10" como un argumento adicional. Es extraño, nunca me habia pasado, No se, quizás debas escapar el texto de alguna manera. Intenta buscar un ejemplo por Internet un ejemplo de DISM para Windows 10 para comprobar que estás utilizando la misma sintaxis.

Supuestamente el código de error 87 es causa de no estar utilizando la versión de DISM para Windows 10: https://support.microsoft.com/en-us/kb/3082581
#3623
Windows / Re: Crear windows desatendido
21 Junio 2016, 20:39 PM
Creo que debería llamarse "Windows 10 Pro", en mi caso es "Windows 10 Pro Technical Preview".

Puedes comprobarlo con el comando DISM:
Código (dos) [Seleccionar]
DISM.exe /Get-WimInfo /WimFile:"...\sources\install.wim"

Saludos
#3624
Programación General / MOVIDO: SOS
21 Junio 2016, 20:15 PM
#3625
Java / Re: SOS
21 Junio 2016, 20:14 PM
Por favor, ponle la correspondiente etiqueta GeShi al código que has publicado. Estás en un foro de programación.

También deberías mencionar en que orden te da excepción y que tipo excepción es con su respectivo mensaje de error, eso en caso de que sea un error en tiempo de ejecución, ya que como no has especificado nada también podría tratarse de errores del compiler ...¿quien sabe?. Danos la información necesaria para poder ayudarte, no somos adivinos.

¿Has depurado el código en cuestión?.

PD: Yo no trabajo con Java, solamente te he indicado cosas básicas que debes proporcionar si formulas una pregunta de programación respecto a un error en un código...

Saludos
#3626
Scripting / Re: ¿Se puede hacer este script?
21 Junio 2016, 19:44 PM
Cita de: davoker en 21 Junio 2016, 15:16 PMSi tenemos que pasar a un lenguaje como tal, se me escapa de las manos, y no sabria como dar los datos que pides mas haya de la explicacion que doy arriba.

Pues por ejemplo: si el nombre de archivo original se llama "andeandara", podrías intentar explicar cual de estos nombres debería seleccionarse y por qué:


  • andeandaraa
  • aandeandara
  • andeandará
  • ándeandara




Cita de: Echizen en 21 Junio 2016, 16:52 PMme imagino que en batch se debe poder hacer lo mismo, no creo que windows sea tan pobre...

No, ese script no es facilmente reproducible. El motor RegEx de Batch es lo más limitado que puedas imaginar, solo sirve para parsear, no para transformar, por ende no existe un equivalente de sed, y de awk tampoco, al menos no de una forma tan directa, puesto que primero se debe declarar un tipo de búcle para obtener el buffer de salida del comando que sirve para listar archivos en una carpeta, y luego una variable que servirá para contar cada linea ...todo esto sin soporte nativo para Arrays ni la asignacion de la salida de un comando a una variable.
Eso es lo que vuelve tedioso a Batch, me refiero, lo que nos costaría un par de lineas de código en otro lenguaje, se convierte en 20 lineas si usamos Batch.

Pero no es cosa de Windows, sino de Batch, pues su propósito no es ser un lenguaje de programación. Windows tiene integrado el soporte para diversos lenguajes de scripting, como VBS, por ejemplo, un lenguaje en el que si que se podría elaborar un código parecido al que has publicado sin demasiadas complicaciones.

Saludos
#3627
Scripting / Re: batch
21 Junio 2016, 19:36 PM
El foro no está para hacer tareas. La próxima vez trata de publicar tus investigaciones y/o demostrar que lo has implementar hacer por ti mismo.

Tema Cerrado.

Saludos
#3628
Scripting / Re: ¿Se puede hacer este script?
21 Junio 2016, 11:05 AM
Como poder, se puede llevar a cabo la implementación de un algoritmo home-made, o siguiendo las bases de algún algoritmo aritmético específico (el cual yo desconozco) para optimizar ese tipo de comparación.

Ahora, ¿hacerlo en Batch? ...no. Es un lenguaje demasiado limitado, es inutil tan siquiera plantearselo, e intentarlo.

Para hacerlo en cualquier otro lenguaje capacitado primero tendrías que explicar las reglas de comparación/descarte más que nada para saber como narices se deberían evaluar los caracteres y las coincidencias de strings, y también para saber si ya existe un algoritmo aritmético que te pueda servir para implementarlo como un algoritmo de programación. En fin, dar todos los detalles posibles a ese nivel. De lo contrario, sinceramente ...no se que esperas que te digamos ni hagamos.

Saludos!
#3629
Hola

En el repositorio de SharpDX (el wrapper más completo de la API de DirectX para .NET) tienes un ejemplo para lo que parece ser un capturador de imágenes:

Ahora, no puedo darte información más precisa por que no utilizo SharpDX ...bueno, en realidad si, pero para cosas muy básicas que nada tienen que ver, así que es como si no lo usase.

De todas formas, SharpDX/DirectX siempre se hace tedioso de usar en caso de que no tengas demasiada experiencia en el tema (como es mi caso xD), y en ese caso yo no te lo recomendaría para una tarea que debería llevarse a cabo de forma simple. Con los métodos de captura de imagen de ElektroKit debería ser suficiente y no deberías tener problemas al usarlos.




Cita de: TrashAmbishion en 21 Junio 2016, 09:09 AMalguna posibilidad de obtener el codigo pa no importar la DLL es por tema

Supongo que ya lo sabrás, pero lo digo de todas formas: GitHub tiene un buscador para encontrar código dentro de un repositorio. Úsalo la próxima vez...

Código (vbnet) [Seleccionar]
<SuppressUnmanagedCodeSecurity>
<DllImport("user32.dll")>
Public Shared Function SetForegroundWindow(ByVal hwnd As IntPtr
) As <MarshalAs(UnmanagedType.Bool)> Boolean
End Function

<SuppressUnmanagedCodeSecurity>
<DllImport("user32.dll", SetLastError:=True)>
Public Shared Function ShowWindow(ByVal hwnd As IntPtr,
   <MarshalAs(UnmanagedType.I4)> ByVal nCmdShow As WindowState
) As <MarshalAs(UnmanagedType.Bool)> Boolean
End Function

<SuppressUnmanagedCodeSecurity>
<DllImport("user32.dll", SetLastError:=True)>
Public Shared Function GetWindowRect(ByVal hwnd As IntPtr,
                              <Out> ByRef rect As Rect
) As <MarshalAs(UnmanagedType.Bool)> Boolean
End Function


+

Código (vbnet) [Seleccionar]
Public Enum WindowState As Integer
   Normal = 1
End Enum


+


+

Código (vbnet) [Seleccionar]
Public Shared Function TakeScreenshotFromObject(ByVal hwnd As IntPtr, ...) As Image
   ' ...
End Function


o también:
Código (vbnet) [Seleccionar]
Public Shared Function TakeScreenshotFromRegion(ByVal rect As Rectangle, ...) As Image
    ' ...
End Function


Saludos
#3630
Cita de: TrashAmbishion 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

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 (vbnet) [Seleccionar]

       <SuppressUnmanagedCodeSecurity>
       <DllImport("user32.dll", SetLastError:=True)>
       Public Shared Function SendInput(ByVal nInputs As Integer,
<MarshalAs(UnmanagedType.LPArray), [In]> ByVal pInputs As Input32(),
                                        ByVal cbSize As Integer
       ) As Integer
       End Function

       <SuppressUnmanagedCodeSecurity>
       <DllImport("user32.dll", SetLastError:=True)>
       Public Shared Function SendInput(ByVal nInputs As Integer,
<MarshalAs(UnmanagedType.LPArray), [In]> ByVal pInputs As Input64(),
                                        ByVal cbSize As Integer
       ) As Integer
       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 (vbnet) [Seleccionar]
Imports Elektro.Core.IO.Enums
Imports Elektro.Core.IO.Tools

Public NotInheritable Class Form1

   Private Sub Button1_Click() Handles Button1.Click

       Process.Start("proceso.exe")
       Thread.Sleep(TimeSpan.FromSeconds(5))
       Keyboard.SendKey(Keys.F10, KeyBehavior.Press)

   End Sub

End Class


Saludos