Salut à tous... J'ai un projet en Pascal : faire un programme qui lit tout ce qu'un utilisateur tape au clavier.
Je ne sais pas par où commencer. Est-ce que quelqu'un peut m'aider ? Merci d'avance.
Salut à tous... J'ai un projet en Pascal : faire un programme qui lit tout ce qu'un utilisateur tape au clavier.
Je ne sais pas par où commencer. Est-ce que quelqu'un peut m'aider ? Merci d'avance.
Salut,
il manque une information, là :
pour en faire quoi ?
Et sinon, attention à être précis au niveau du vocabulaire, ça évitera des confusions : un programme ne lit pas ce qu'un utilisateur tape, il récupère ce que l'utilisateur tape, et attention, ça va vite devenir compliqué : par exemple, quand je tape ce texte en ce moment, si un programme doit récupérer les lettres sans perturber ce que je fais, ça veut dire qu'il va falloir insérer le programme de récupération quelque part entre le pilote du clavier et le programme qui affiche ce qui est tapé, l'éditeur du forum dans mon navigateur.
Très compliqué, et géré différemment en fonction du système d'exploitation (dont tu ne nous dis rien)...
Bonjour et bienvenue dans le forum Pascal !
Quand vous posez une question, il est toujours bon de préciser quel est le compilateur que vous utilisez (et aussi, comme l'a dit Jipété, quel est votre système d'exploitation).
Si c'est pour récupérer une chaîne entière, que l'utilisateur a validée en appuyant sur la touche Entrée, vous pouvez utilisez la procédure ReadLn.
Si c'est pour récupérer chaque touche sur laquelle l'utilisateur appuie, vous pouvez utiliser la procédure Read, ou encore la procédure ReadKey de l'unité Crt.
Effectivement, le clavier c'est une entrée système. Windows permet cela avec des hooks (le crochetage du clavier). Certains antivirus reconnaîtrons le programme comme étant un Keylogger et pourraient le bloquer.
Avec Delphi/Lazarus :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
68
69
70
71
72
73
74
75
76
77
78
79
80 unit Unit1; {$mode objfpc}{$H+} interface uses Classes, SysUtils, Forms, Controls, Graphics, Dialogs; type { TForm1 } TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private public end; var Form1: TForm1; implementation uses windows ; const wh_keybd_ll = 13; type KeybdLLHookStruct = record vkCode : cardinal; scanCode : cardinal; flags : cardinal; time : cardinal; dwExtraInfo : cardinal; end; var kHook : cardinal; Vk_ToucheActive : integer; Vk_Param : integer; function LowLevelKeybdHookProc(nCode: LongInt; WPARAM: WPARAM; lParam: LPARAM): LRESULT; stdcall; // possible wParam values: WM_KEYDOWN, WM_KEYUP, WM_SYSKEYDOWN, WM_SYSKEYUP var info : ^KeybdLLHookStruct absolute lParam; kState : TKeyboardState; begin result := CallNextHookEx(kHook, nCode, wParam, lParam); with info^ do begin GetKeyboardState(kState); Vk_ToucheActive:=vkCode; Vk_Param:=wParam; Form1.Caption := 'Code touche : ' + IntToStr(Vk_ToucheActive); end; end; {$R *.lfm} { TForm1 } procedure TForm1.FormCreate(Sender: TObject); begin kHook := SetWindowsHookEx(wh_keybd_ll, @LowLevelKeybdHookProc, hInstance, 0); end; end.
Il faut lancer un programme sur le pc dont on veut tester le clavier, et ce programme ne ralentira pas la saisie, car il va juste capter l’interruption clavier (interruption systeme mais msdos fait une couche par dessus) au moment où elle se produit, c'est à dire dés qu'une touche est pressée, et là il va regarder quelle touche a été pressée et l'enregistrer avant de se remettre à l'attente de l'interruption clavier.ça veut dire qu'il va falloir insérer le programme de récupération quelque part entre le pilote du clavier et le programme qui affiche ce qui est tapé, l'éditeur du forum dans mon navigateur.
Bonjour,
Quelques extraits d'un vieux code qui faisait de la conversion euro-franc en s'intégrant à toute application (hooks clavier et presse papier, dll autocollante, fichier mappé en mémoire...). Il est possible que certains arguments doivent changer de type quoique la compatibilité nous en préserve peut être.
Quand on déclare un hook, Windows insère notre propre fonction callback dans la chaîne de fonctions de ce hook. Chaque fonction insérée peut décider de briser ou non cette chaîne. Par exemple, si la combinaison Alt+Ctrl+! doit déclencher une action, on ne souhaite généralement pas qu'elle affecte en plus l'application active : alors on casse la chaîne.
Salutations
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 var hHookCatch : hHook; // Handle du hook "Catch" isCatching : Boolean; // True : le Hook est actif isEating : Boolean; // True : le hook absorbe le caractère {-------------------------------------------------------------------------} function Catch(Code : integer; wParam, lParam : Longint): Longint; stdcall; begin // Hook Keyboard : Catch est la fonction callback appelée par Windows //... if code = HC_ACTION then begin KeyIn := word(wParam); if (lParam shr 30) < 2 then begin // Une touche descend //... end else begin // Une touche remonte //... end if isEating then Exit(-1); // Si la combinaison de touches est consommée la chaîne d'appels s'arrête là end; Result := CallNextHookEx(hHookCatch, Code, wParam, lParam); // Passer à la fonction callback suivante end; {-------------------------------------------------------------------------} procedure StartCatch; // Met le "hook" ! begin if isCatching then Exit; hHookCatch := SetWindowsHookEx(WH_KEYBOARD, Catch, hInstance, 0); // @Catch en FreePascal if hHookCatch = 0 then raise ESetHookError.Create('Impossible d''activer le "hook"') else isCatching := true; end; {-------------------------------------------------------------------------} procedure StopCatch; // Si actif, arrêter le "hook" begin if isCatching then UnhookWindowsHookEx(hHookCatch); isCatching := false; end;
Partager