Bonjours à tous !

Après de longue et pénibles recherche sur internet, j'ai enfin trouvé un code qui semble propre pour faire un hook clavier.

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
 
private const int WH_KEYBOARD_LL = 13;
        private const int WM_KEYDOWN = 0x0100;
        private static LowLevelKeyboardProc _proc = HookCallback;
        private static IntPtr _hookID = IntPtr.Zero;
 
 
        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern IntPtr SetWindowsHookEx(int idHook, LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId);
 
        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        private static extern bool UnhookWindowsHookEx(IntPtr hhk);
 
        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);
 
        [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern IntPtr GetModuleHandle(string lpModuleName);
 
        private delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam);
 
        private static IntPtr SetHook(LowLevelKeyboardProc proc)
        {
            using (Process curProcess = Process.GetCurrentProcess())
            using (ProcessModule curModule = curProcess.MainModule)
            {
                return SetWindowsHookEx(WH_KEYBOARD_LL, proc, GetModuleHandle(curModule.ModuleName), 0);
            }
        }
 
        private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
        {
            if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN)
            {
                int vkCode = Marshal.ReadInt32(lParam);
 
                if ((Keys)vkCode == Keys.PrintScreen)
                {
                }
 
                //Console.WriteLine((Keys)vkCode);
            }
            return CallNextHookEx(_hookID, nCode, wParam, lParam);
        }
 
 
 
        public Client()
        {
            InitializeComponent();
 
            _hookID = SetHook(_proc);
            UnhookWindowsHookEx(_hookID);
        }

Autant vous dire que a part les importations, je n'y comprend pas grand chose. Cependant, le code ne présente pas d'erreur mais ne semble pas non plus fonctionner.

A vrai dire, je ne sais pas ou je peux récupérer la touche pressée !

j'ai essayé à la ligne avec le commentaire //Console.WriteLine((Keys)vkCode); mais je n'ai rien.

Le problème c'est que le code source est fait pour une application console , donc le code

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
 
_hookID = SetHook(_proc);
            UnhookWindowsHookEx(_hookID);
que j'ai placé dans public Client était dans Main dans le code source. cependant, étant donné que je suis dans une winform, je n'ai pas de Main (a part dans programm.cs) mais du coup il ne reconnait pas puisque le reste (importations, procédure...) est dans la class Form1.

bref, je suis un peu perdu...

Merci de votre aide !