Discussions au sujet de NI LabVIEW

annuler
Affichage des résultats de 
Rechercher plutôt 
Vouliez-vous dire : 

SendInput

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 :

 

SR1.png

 

Ce qui donne le petit code démo ci-dessous :

 

SR2.png

 

 

 

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) Smiley tirant la langue  Smiley clignant de l'œil

 

0 Compliments
Message 1 sur 2
4 402 Visites

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 :

 

SR1.png

 

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.

 

0 Compliments
Message 2 sur 2
4 390 Visites