@okik
Hola.
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).
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:
Saludos
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