02-19-2014 05:06 PM - modifié 02-19-2014 05:23 PM
Juste pour ceux que cela intéressent (j'ai cherché, j'ai trouvé ...je partage, nothing else)
objet : Utilisation de la fonction windows "SendInput" (pour simuler un keystroke)
Dans les rares exemples que j'ai pu trouver, on utilise la fonction "keybd_event".
Cependant, cette fonction a été remplacée par la fonction "SendInput". ( lien ici )
J'ai donc cherché à utiliser cette fonction (SendInput) au départ de Labview.
J'ai regardé sur les forums (Fr et US) ...Je n'ai rien trouvé "qui fonctionne" utilisant cette fonction SendInput".
Donc ... Google + analyse des structures C.
UINT WINAPI SendInput(
_In_ UINT nInputs,
_In_ LPINPUT pInputs,
_In_ int cbSize
);
nInputs = The number of structures in the pInputs array.
pInputs = An array of INPUT structures
cbSize = The size, in bytes, of an INPUT structure.
If cbSize is not the size of an INPUT structure, the function fails.
INPUT structures
typedef struct tagINPUT {
DWORD type;
union {
MOUSEINPUT mi;
KEYBDINPUT ki; <=== le bête!
HARDWAREINPUT hi;
}; } INPUT, *PINPUT;
structure KEYBDINPUT
typedef struct tagKEYBDINPUT {
WORD wVk;
WORD wScan;
DWORD dwFlags;
DWORD time;
ULONG_PTR dwExtraInfo;
} KEYBDINPUT, *PKEYBDINPUT;
Si on transforme le tout version LV, on a :
nInputs = U32
pInputs = un pointeur sur un Tableau (de structures)
cbSize = U32
ce sera un Tableau de Cluster (la structure).
Le dit Cluster sera composé de :
type = U32
wVK = U16
wScan = U16
dwFlags = U32
time = U32
dwExtraInfo = U32
et si on fait le compte, cela fait 20 bytes.
donc ... on met "20" sur l'entrée "cbSize" (voir la 1ere phrase "soulignée)
et ... et ... ça ne fonctionne pas !! (zut)
astuce :
il y a un "padding" de 8 bytes pour que la "structure" soit compatible avec la structure
relative à la souris (MOUSEINPUT mi). Il faut donc ajouter 8 bytes (inutiles ici, juste pour le size)
par exemple, un DBL.
Le Cluster (composant le Tableau) devient donc :
type = U32
wVK = U16
wScan = U16
dwFlags = U32
time = U32
dwExtraInfo = U32
Padding = DBL
comme ceci :
Ce qui donne le petit code démo ci-dessous :
2 = le nb d'éléments insérés dans la file d'affichage du clavier (ici "xA0" + "x42" ... soit shift+b ... soit B)
attention, les codes correspondent aux Virtual-Key-codes ( le lien ici )
28 (20+8) = la dimension en bytes de notre structure (cluster composant le tableau)
La fonction retourne le nombre d'éléments effectivement insérés dans la file.
Ce vi affichera une suite de B (majuscule) dans la fenêtre de l'application qui a le focus. (5/sec)
Pour Luc : je vais essayer de faire "un vrai", pas une "machine à écrire" (je taquine)
![]()
02-19-2014 05:57 PM - modifié 02-19-2014 06:01 PM
Petite précision (importante)
L'ordre dans le Cluster est primordial.
L'ordre dans le Cluster et l'ordre dans la Structure doivent correspondre,
comme ceci :
PS:
dans l'exemple donné, il y a un double cluster imbriqué. (le cluster est dans un cluster ... j'ai pas vu)
cela n'influence pas, le pointeur est de toute façon synchro sur le début des données ... mais c'est plus "propre" d'enlever le cluster inutile.