Bonjour,
Je travaille sur un projet en stage et j'essaye de mettre en place un KeyLogger complet pour un clavier Allemand afin d'enregistrer les actions d'un utilisateur (l'utilisateur est au courant du fait que ses saisies clavier sont enregistres, cest pour mener une etude)
Javais une premiere solution qui marchait pas mal avec KeyPress, sauf que je me suis rendu compte il y a quelques jours que je ne recuperais pas les combinaisons du style ctrl + A. Apres quelques recherces, je me suis rendu compte quil fallait en fait que j'utilise les evenements KeyUp et KeyDown pour avoir une solution complete. J'ai donc essaye de mettre en place des flag de type booleen sur Control et Alt dans ma WinForm, en utilisant les attributs de KeyEventArgs Alt, Control, modifiers etc.
Voici le code de ma WinForm et le code de KeyProc :
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 private IntPtr KeyProc(int nCode, int wParam, IntPtr lParam) { bool handled = false; //On verifie si tous est ok if ((nCode >= 0) && (m_onKeyDown != null || m_onKeyUp != null || m_onKeyPress != null)) { //Remplissage de la structure KeyboardHookStruct a partir d'un pointeur KeyboardHookStruct MyKeyboardHookStruct = (KeyboardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyboardHookStruct)); //KeyDown if (m_onKeyDown != null && (wParam == 0x100 || wParam == 0x104)) { Keys keyData = (Keys)MyKeyboardHookStruct.vkCode; KeyEventArgs e = new KeyEventArgs(keyData); m_onKeyDown(this, e); handled = handled || e.Handled; } // KeyPress if (m_onKeyPress != null && wParam == 0x100) { // Si la touche Shift est appuyée bool isShift = ((GetKeyState(0x10) & 0x80) == 0x80 ? true : false); // Si la touche CapsLock est appuyée bool isCapslock = (GetKeyState(0x14) != 0 ? true : false); //bool isCtrl = (GetKeyState(0x11) != 0 ? true : false); //bool isAlt = (GetKeyState(0x12) != 0 ? true : false); byte[] keyState = new byte[256]; GetKeyboardState(keyState); byte[] inBuffer = new byte[2]; if (ToAscii(MyKeyboardHookStruct.vkCode, MyKeyboardHookStruct.scanCode, keyState, inBuffer, MyKeyboardHookStruct.flags) == 1) { char key = (char)inBuffer[0]; if ((isCapslock ^ isShift) && Char.IsLetter(key)) key = Char.ToUpper(key); KeyPressEventArgs e = new KeyPressEventArgs(key); m_onKeyPress(this, e); handled = handled || e.Handled; } } // KeyUp if (m_onKeyUp != null && (wParam == 0x101 || wParam == 0x105)) { Keys keyData = (Keys)MyKeyboardHookStruct.vkCode; KeyEventArgs e = new KeyEventArgs(keyData); m_onKeyUp(this, e); handled = handled || e.Handled; } }Quand j'appuie sur la touche control, elle s'affiche bien dans la textBox mais pourtant e.Control est toujours faux, je ne comprends pas pourquoi. Mon objectif etant dutiliser un booleen qui detecte si Controle est active dans KeyDown, puis de remettre le flag a false quand la touche est relache (donc detecte dans KeyUp).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 private void OnKeyUp(object sender, KeyEventArgs e) { if (e.Control) flagD = false; } private void OnKeyDown(object sender, KeyEventArgs e) { textBox1.Text += e.KeyCode; flagD = e.Control ? true : false; textBox1.Text += " " + flagD; }
Je suis bien perdu et je bloque depuis plusieurs jours, un peu d'aide serait grandement apprecie.. Je suis encore bien noob en C# j'ai commence il y a un mois et demi donc si il y a un peu de lecture a avoir qui pourrait m'etre utile je suis aussi preneur
Bonne journee, merci d'avance, Vincent
Partager