[VB.NET] et [VB2010] SendInput utilisation

Résolu
lolo3670 - 5 nov. 2012 à 08:29
 Bernard - 16 mars 2019 à 15:44
Bonjour,
Cela fait longtemps que cherche comment on utilise la fonction SendInput de l'api Windows.
J'aurai besoin de votre avec entre autre :
[list]
[*] D'un code qui permet de créer la structure input(qui normalement est utilisée)
[*] D'une explication siple et claire de toutes les variables qu'elles contient
[*] D'un petit exemple de déclaration de la fontion avec explication des paramètres de la fonction
/list

J'ai déjà fait des recherches mais je n'ai pas réussi à trouver ce qui m’intéresse vraiment car c'est le bazar et je n'arrive pas à faire le tri.
J'ai peut-être une piste que je développe mais j'ai préféré posté un message sur le forum(pour la sécurité)

Merci, si jamais vous d'autres infos sur SendInput me prévenir dans sujet

6 réponses

Avec une petite modification de ma part le programme MARCHE !!!

J'a juste apporté une modification pour l'mportation de la dll et fait une petite modif à la fonction main (qui s'appelle appuyertouche maintenant)

Code :
Imports System.Runtime.InteropServices
Module Struct
Const INPUT_MOUSE As UInteger = 0UI
Const INPUT_KEYBOARD As UInteger = 1UI
Const INPUT_HARDWARE As UInteger = 2UI

<StructLayout(LayoutKind.Sequential)> _
Structure MOUSEINPUT
Public dx As Integer
Public dy As Integer
Public mouseData As UInteger
Public dwFlags As UInteger
Public time As UInteger
Public dwExtraInfo As IntPtr
End Structure

<StructLayout(LayoutKind.Sequential)> _
Structure KEYBDINPUT
Public wVk As UShort
Public wScan As UShort
Public dwFlags As UInteger
Public time As UInteger
Public dwExtraInfo As IntPtr
End Structure

<StructLayout(LayoutKind.Sequential)> _
Structure HARDWAREINPUT
Public uMsg As UInteger
Public wParamL As UShort
Public wParamH As UShort
End Structure

<StructLayout(LayoutKind.Explicit)> _
Structure INPUT
<FieldOffset(0)> _
Public type As UInteger
<FieldOffset(4)> _
Public mi As MOUSEINPUT
<FieldOffset(4)> _
Public ki As KEYBDINPUT
<FieldOffset(4)> _
Public hi As HARDWAREINPUT
End Structure

Declare Function SendInput Lib "User32" (ByVal nInputs As UInteger, ByRef pInputs As INPUT, ByVal cbSize As Integer) As UInteger

Const KEYEVENTF_EXTENDEDKEY As UInteger = &H1UI
Const KEYEVENTF_KEYUP As UInteger = &H2UI
Const KEYEVENTF_SCANCODE As UInteger = &H8UI
Const KEYEVENTF_UNICODE As UInteger = &H4UI

Const VK_A As UShort = &H41

Sub appuyertouche(touche As Integer)

Dim pInputs As INPUT
Dim rCount As UInteger
pInputs.type = INPUT_KEYBOARD
pInputs.ki.wVk = touche
pInputs.ki.wScan = 0
pInputs.ki.dwFlags = 0UI
pInputs.ki.time = 0UI
pInputs.ki.dwExtraInfo = IntPtr.Zero
rCount = SendInput(1UI, pInputs, Marshal.SizeOf(pInputs))
End Sub

End Module

Le paramètre touche peut prendre les valeurs de touches normales c'est à dire les même chiffre qui sont utilisés pour getkeystate de l'api Windows (65 pour a...)
1
En fait dans "appuyertouche" il faut envoyer 2 fois le "sendInput": une première fois comme indiqué dans l'exemple pour appuyer sur la touche, puis une deuxième fois avec pInputs.ki.dwFlags = KEYEVENTF_KEYUP pour relâcher la touche:
.
.
Sub appuyertouche(touche As Integer)
' paramètre touche peut prendre les valeurs de touches normales c'est à dire les même chiffre qui sont utilisés pour getkeystate de l'api Windows (65 pour a...)
Dim pInputs As INPUT
Dim rCount As UInteger
pInputs.type = INPUT_KEYBOARD
pInputs.ki.wVk = touche
pInputs.ki.wScan = 0
pInputs.ki.dwFlags = 0UI 'On presse la touche
pInputs.ki.time = 0UI
pInputs.ki.dwExtraInfo = IntPtr.Zero
rCount = SendInput(1UI, pInputs, Marshal.SizeOf(pInputs))
pInputs.ki.dwFlags = KEYEVENTF_KEYUP 'On relache la touche
rCount = SendInput(1UI, pInputs, Marshal.SizeOf(pInputs))

End Sub
0
Utilisateur anonyme
5 nov. 2012 à 11:14
Bonjour,

Le mieux est de prendre la documentation de la MSDN et de décortiquer

Voilà la structure principal des fonctions en VB.NET :

Const INPUT_MOUSE As UInteger = 0UI
Const INPUT_KEYBOARD As UInteger = 1UI
Const INPUT_HARDWARE As UInteger = 2UI

<StructLayout(LayoutKind.Sequential)> _
Structure MOUSEINPUT
  Public dx As Integer
  Public dy As Integer
  Public mouseData As UInteger
  Public dwFlags As UInteger
  Public time As UInteger
  Public dwExtraInfo As IntPtr
End Structure

<StructLayout(LayoutKind.Sequential)> _
Structure KEYBDINPUT
  Public wVk As UShort
  Public wScan As UShort
  Public dwFlags As UInteger
  Public time As UInteger
  Public dwExtraInfo As IntPtr
End Structure

<StructLayout(LayoutKind.Sequential)> _
Structure HARDWAREINPUT
  Public uMsg As UInteger
  Public wParamL As UShort
  Public wParamH As UShort
End Structure

<StructLayout(LayoutKind.Explicit)> _
Structure INPUT
  <FieldOffset(0)> _
  Public type As UInteger
  <FieldOffset(4)> _
  Public mi As MOUSEINPUT
  <FieldOffset(4)> _
  Public ki As KEYBDINPUT
  <FieldOffset(4)> _
  Public hi As HARDWAREINPUT
End Structure

<DllImport("user32.dll", SetLastError:=True)> _
Function SendInput(ByVal nInputs As UInteger, ByRef pInputs As INPUT, ByVal cbSize As Integer) As UInteger
End Function


En gros, SendInput permet de simuler la souris, le clavier ou un périphérique.
Selon ce que tu veux simuler, l'utilisation sera différente

Un exemple d'utilisation pour la simulation de la lettre "a" du clavier
Const KEYEVENTF_EXTENDEDKEY As UInteger = &H1UI
Const KEYEVENTF_KEYUP As UInteger = &H2UI
Const KEYEVENTF_SCANCODE As UInteger = &H8UI
Const KEYEVENTF_UNICODE As UInteger = &H4UI

Const VK_A As UShort = &H41

Sub Main()

  Dim pInputs As INPUT
  Dim rCount As UInteger
  pInputs.type = INPUT_KEYBOARD
  pInputs.ki.wVk = VK_A
  pInputs.ki.wScan = 0
  pInputs.ki.dwFlags = 0UI
  pInputs.ki.time = 0UI
  pInputs.ki.dwExtraInfo = IntPtr.Zero
  rCount = SendInput(1UI, pInputs, Marshal.SizeOf(pInputs))

  Console.ReadKey() ' Lecture de la touche simulé

  Console.WriteLine()
  Console.WriteLine("rCount = {0}", rCount)
  Console.ReadKey()

End Sub


Pour les explications, il suffit de lire la documentation MSDN sur KEYBDINPUT. J'ai fais l'exemple avec.

_____________
Kenji
0
Merci de ton aide. Je pense que ce code pourrait marcher mais j'ai juste un petit(gros ) problème :
Les instructions du style <StructLayout(LayoutKind.Sequential)> me génère une erreur : "Type StructLayout non défini"
J'avais déjà vu ce mais je n't comprenais rien mais maintenant c'est plu clair
J'ai vb 2010 sur mon ordi peut être que c'est un peu différent comme programme

Merci quand même

Mais j'ai encore besoin d'ade pour les StructLayout.
0
J'ai trouvé le moyen de convertir :
<DllImport("user32.dll", SetLastError:=True)> _
Function SendInput(ByVal nInputs As UInteger, ByRef pInputs As INPUT, ByVal cbSize As Integer) As UInteger
End Function
en
Declare Function SendInput Lib "User32" (ByVal nInputs As UInteger, ByRef pInputs As INPUT, ByVal cbSize As Integer) As UInteger
qui est plus simple et qui ne me marque pas d'erreur
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
J'ai trouvé : il suffisait d'importer System.Runtime.InteropServices
avec imports System.Runtime.InteropServices
0
Il sufit dans votre programme d'utiliser la méthode appuyertouche
0
Rejoignez-nous