[VB.NET] et [VB2010] SendInput utilisation [Résolu]

lolo3670 - 5 nov. 2012 à 08:29 - Dernière réponse :  lolo3670
- 5 nov. 2012 à 12:08
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
Afficher la suite 

Votre réponse

6 réponses

Meilleure réponse
3
Merci
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...)

Merci lolo3670 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 123 internautes ce mois-ci

Commenter la réponse de lolo3670
Charles Racaud 3181 Messages postés dimanche 15 février 2004Date d'inscription 9 avril 2017 Dernière intervention - 5 nov. 2012 à 11:14
0
Merci
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
Commenter la réponse de Charles Racaud
0
Merci
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.
Commenter la réponse de lolo3670
0
Merci
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
Commenter la réponse de lolo3670
0
Merci
J'ai trouvé : il suffisait d'importer System.Runtime.InteropServices
avec imports System.Runtime.InteropServices
Commenter la réponse de lolo3670
0
Merci
Il sufit dans votre programme d'utiliser la méthode appuyertouche
Commenter la réponse de lolo3670

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.