1 pièce(s) jointe(s)
Création d'une macro clavier
Bonjour,
Mon projet est de créer des macros claviers capable d'écrire de longues chaines par l'appui d'une touche ex: CTRL+ALT+touche alphanumérique.
Grâce aux tutoriels du Forum, j'ai créé une DLL qui hameçonne les frappes clavier. Elle fonctionne bien.
Dans mon programme, je capture les frappes de touches et je les affiche dans un mémo (pour mise au point). Jusque là pas de pb.
A l'appui d'une touche (ici la touche B ), je désire envoyer une chaine de caractère qui sera reçue par une autre application quelconque.
J'ai réussi à envoyer 1 caractères ex A . Quand j’appuie sur B il m'écrit bien A.
là où cela se complique, c'est pour envoyer plusieurs caractères.
Voici le code de la fonction:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
| PROCEDURE TForm3.OnWmCopyData(var Msg : TMessage);
TYPE
TPCopyDataStruct = ^TCopyDataStruct;
TPDataEnvoyes = ^TDataEnvoyes;
VAR
DataEnvoyes : TDataEnvoyes;
PDataEnvoyes : TPDataEnvoyes;
PCopyDataStruct : TPCopyDataStruct;
KeyState : TKeyState;
BEGIN
PCopyDataStruct := TPCopyDataStruct(Msg.LPARAM);
PDataEnvoyes := PCopyDataStruct^.lpData;
DataEnvoyes := PDataEnvoyes^;
KeyState := GetEtatTouche(DataEnvoyes.State);
passkey := DataEnvoyes.State;
Keypressed := KeyState.Pressed;
Keyreaded := DataEnvoyes.Key;
IF (Keyreaded = ord('B')) AND (Keypressed) THEN
Permission := NOT Permission;
Msg.Result := 1;
IF (Permission) THEN
Msg.Result := 0;
{ pour mise au point }
if (Permission) then
begin
if NOT KeyState.PrevPressed then
Memo1.Lines.Add('Clavier autorisé touche = ' + chr(Keyreaded));
// Memo1.Lines.Add('Touche étendue = '+BoolToStr(KeyState.ExtendedKey)) ;
// Memo1.Lines.Add('Touche ALT = '+BoolToStr(KeyState.Alt)) ;
// Memo1.Lines.Add('Touche pressée auparavant = '+BoolToStr(KeyState.PrevPressed)) ;
// Memo1.Lines.Add('');
end else begin
Memo1.Lines.Add('Clavier bloqué');
Memo1.Lines.Add('');
{ si touche relachée : émettre un message }
Permission := True;
Msg.Result := 0;
// keybd_event(ord('A'),0,0,0);
EnvoiChaine(Msg, 'Hello world !');
Msg.Result := 1;
end;
END; // ROCEDURE TForm3.OnWmCopyData
{ ---------------------------------------------------------------- }
PROCEDURE TForm3.EnvoiChaine(var Msg : TMessage; s : String);
var
LongChaine, i : Integer;
sChar : Char;
begin
LongChaine := length(s);
for i := 1 to LongChaine do
begin
sChar := s[ i ];
keybd_event(ord(sChar), 0, 0, 0);
keybd_event(ord(sChar), 0, KEYEVENTF_KEYUP, 0);
Sleep(10);
end;
end; |
et voici ce que j'obtiens (fichier joint) à droite mon mémo de contrôle, à gauche le résultat dans l'application.:mrgreen:
Si quelqu'un peut me donner un tuyau, grand merci.
Création d'une macro clavier
Citation:
u ne nous dis pas où se trouve la difficulté, mais c'est certainement un problème de réentrance
Justement, je n'ai pas trouvé! De plus le pas à pas de Delphi bloque Windows!
Ce que je ne comprends pas c'est que la première lettre (H) est bien reçue par l'application cible alors que les caractères suivants se trouvent remplacés par "5/ /4" ???
D'autre part, qu'entends tu par Hook standard ?
Puis-je vraiment utiliser des Hotkey pour écrire dans une autre application qui détient le focus ?
Enfin, je vais tester SendInput.
Merci pour ta réponse, je tiens le forum au courant.