SendInput user32

cs_Alien Messages postés 70 Date d'inscription mardi 4 juin 2002 Statut Membre Dernière intervention 23 mars 2024 - 22 sept. 2022 à 23:02
cs_Alien Messages postés 70 Date d'inscription mardi 4 juin 2002 Statut Membre Dernière intervention 23 mars 2024 - 22 sept. 2022 à 23:49

Bonjour,

J'aimerais simuler les touches Clavier et souris à distance que j'envois via mes deux logiciels Client/Serveur.

Je le faisais avec keybd_event et mouse_event et maintenant j'essai de faire la même chose avec SendInput.

Malheureusement tous les exemples que je trouve sur le net ne fonctionne pas.

Quelqu'un pourrait me dire ce qui cloche sur mon code pour que cela fonction svp ?

J'ai testé plein de combinaison sans succès, je vous montre mes derniers en date.

Pour info voici ma Class.

Imports System.Runtime.InteropServices

Public Class SendInputs

#Region " Region Dlls & Déclaration"
    <DllImport("user32.dll")>
    Private Shared Function SendInput(
        ByVal nInputs As Integer,
        ByVal pInputs() As INPUT,
        ByVal cbSize As Integer) As Integer
    End Function
    Private Const KeyDown As Integer = &H0
    Private Const KeyUp As Integer = &H2
    <StructLayout(LayoutKind.Explicit)>
    Private Structure INPUT
        'Field offset 32 bit machine 4
        '64 bit machine 8
        <FieldOffset(0)>
        Public type As Integer
        <FieldOffset(8)>
        Public mi As MOUSEINPUT
        <FieldOffset(8)>
        Public ki As KEYBDINPUT
        <FieldOffset(8)>
        Public hi As HARDWAREINPUT
    End Structure
    Private Structure MOUSEINPUT
        Public dx As Integer
        Public dy As Integer
        Public mouseData As Integer
        Public dwFlags As Integer
        Public time As Integer
        Public dwExtraInfo As IntPtr
    End Structure
    Private Structure KEYBDINPUT
        Public wVk As Short
        Public wScan As Short
        Public dwFlags As Integer
        Public time As Integer
        Public dwExtraInfo As IntPtr
    End Structure
    Private Structure HARDWAREINPUT
        Public uMsg As Integer
        Public wParamL As Short
        Public wParamH As Short
    End Structure
    <Flags()>
    Friend Enum InputType As Integer
        Mouse = 0
        Keyboard = 1
        Hardware = 2
    End Enum
    <Flags()>
    Friend Enum MOUSEEVENTF As Integer
        MOVE = &H1
        LEFTDOWN = &H2
        LEFTUP = &H4
        RIGHTDOWN = &H8
        RIGHTUP = &H10
        MIDDLEDOWN = &H20
        MIDDLEUP = &H40
        XDOWN = &H80
        XUP = &H100
        VIRTUALDESK = &H400
        WHEEL = &H800
        ABSOLUTE = &H8000
    End Enum
    <Flags()>
    Public Enum KEYEVENTF As Integer
        KEYDOWN = 0
        EXTENDEDKEY = 1
        KEYUP = 2
        [UNICODE] = 4
        SCANCODE = 8
    End Enum
#End Region

#Region " Region Sub & Function"
    Public Shared Sub SendKey(ByVal key As Char)
        Dim Inpts(1) As INPUT

        'key down
        Inpts(0).type = InputType.Keyboard
        Inpts(0).ki.wVk = Convert.ToInt16(CChar(key))
        Inpts(0).ki.dwFlags = KEYEVENTF.KEYDOWN
        Inpts(0).ki.time = 0

        'key up
        Inpts(1).type = InputType.Keyboard
        Inpts(1).ki.wVk = Convert.ToInt16(CChar(key))
        Inpts(1).ki.dwFlags = KEYEVENTF.KEYUP
        Inpts(0).ki.time = 0

        SendInput(Inpts.Count, Inpts, Marshal.SizeOf(GetType(INPUT)))
    End Sub
    Public Shared Sub SendKey2(ByVal key As Char)
        Dim Inpts(0) As INPUT

        Inpts(0).type = InputType.Keyboard
        'Inpts(0).ki.wScan = KEYEVENTF.SCANCODE
        Inpts(0).ki.wVk = Convert.ToInt16(CChar(key))
        Inpts(0).ki.dwFlags = KEYEVENTF.KEYDOWN And KEYEVENTF.KEYUP  'And KEYEVENTF.SCANCODE
        'Inpts(0).ki.time = 0
        'Inpts(0).ki.dwExtraInfo = IntPtr.Zero

        SendInput(Inpts.Count, Inpts, Marshal.SizeOf(GetType(INPUT)))
    End Sub
#End Region

End Class

et voici l'appel.

	Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
		SendInputs.SendKey("t")
	End Sub

	Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button3.Click
		SendInputs.SendKey2("t")
	End Sub

2 réponses

cs_Alien Messages postés 70 Date d'inscription mardi 4 juin 2002 Statut Membre Dernière intervention 23 mars 2024
22 sept. 2022 à 23:43

Bon, désolé ! 

Je viens de trouver mon erreur, il faut juste savoir lire :p

        'Field offset 32 bit machine 4
        '64 bit machine 8

J'ai donc remplacé les 8 par des 4 ! et ça fonctionne pour la souris ! bon je dois encore trouver le param 

pour quelle se déplace en absolue et pas en relatif.
Ensuite je vais m'intérreser au clavier 

    <StructLayout(LayoutKind.Explicit)>
    Private Structure INPUT
        'Field offset 32 bit machine 4
        '64 bit machine 8
        <FieldOffset(0)>
        Public type As Integer
        <FieldOffset(8)>
        Public mi As MOUSEINPUT
        <FieldOffset(8)>
        Public ki As KEYBDINPUT
        <FieldOffset(8)>
        Public hi As HARDWAREINPUT
    End Structure

0
cs_Alien Messages postés 70 Date d'inscription mardi 4 juin 2002 Statut Membre Dernière intervention 23 mars 2024
Modifié le 22 sept. 2022 à 23:49

Je me fais un mono ! mais bon si ça peut aider.

Pour controler la souris en absolue (c'est à dire à partir du coin supérieur gauche de l'écran voici le code:

PS: N'oubliez pas que les coordonnées sont pour la largeur et la longueur sur 65535

donc le centre de l'écran doit avoir les valeurs

        Inpts(0).mi.dx = 32676
        Inpts(0).mi.dy = 32676
    Public Shared Sub SendKey3(ByVal key As Char)
        Dim Inpts(0) As INPUT

        Inpts(0).mi.dx = 32676
        Inpts(0).mi.dy = 32676
        Inpts(0).mi.mouseData = 0
        Inpts(0).mi.dwFlags = MOUSEEVENTF.ABSOLUTE + MOUSEEVENTF.MOVE '+ MOUSEEVENTF.RIGHTUP + MOUSEEVENTF.RIGHTDOWN
        Inpts(0).mi.time = 0
        Inpts(0).mi.dwExtraInfo = 0

        SendInput(Inpts.Count, Inpts, Marshal.SizeOf(GetType(INPUT)))
    End Sub

0
Rejoignez-nous