2016-11-07 17 views
0

Я сделал очень простые коды Крючка (я новичок).Как правильно отвязать?

Я открыл Блокнот и протестировал.

Если я нажимаю клавишу «ЛЮБОЙ», он делает звуковой сигнал и печатает сам.

За исключением ключа «x», это ключ терминатора.

Вопрос:

Я не хочу видеть «х» ключ печатается. Я просто ушел из программы. Что мне нужно сделать ?

namespace HookingStudy 
{ 
    class HookingClass   
    { 
     private const int WM_KEYDOWN = 0x0100; 
     private static LowLevelKeyboardProc _proc = hookCallBack; 
     private static IntPtr _hookID = IntPtr.Zero;      
     public static void Main() 
     { 
      Beep(1111, 222); 
      _hookID = SetHook(_proc); 
      Application.Run(); 
     } 
     private static IntPtr hookCallBack(int nCode, IntPtr wParam, IntPtr lParam) 
     { 
      if(nCode >= 0 && wParam == (IntPtr) WM_KEYDOWN) 
      { 
       int vkCode = Marshal.ReadInt32(lParam); 
       if(vkCode.ToString() == "88")     // 88 ("x" key) 
       { 
        Beep(7777, 222); 
        UnhookWindowsHookEx(_hookID);  
        Process.GetCurrentProcess().Kill(); 
       } 
       Beep(2222, 55); 
      } 
      return CallNextHookEx(_hookID, nCode, wParam, lParam); 
     } 
     private static IntPtr SetHook(LowLevelKeyboardProc proc) 
     { 
      using(Process curProcess = Process.GetCurrentProcess()) 
      using(ProcessModule curModule = curProcess.MainModule) 
      { 
       return SetWindowsHookEx(13, proc, GetModuleHandle(curModule.ModuleName), 0); 
      }     
     } 
     private delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam); 
     [DllImport("KERNEL32.DLL")]        
     extern public static void Beep(int freq, int dur);  
     [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); 
    } 
} 
+1

'vkCode.ToString() == "88"' смешно. – Sinatr

+0

Да. К счастью, это работает. – Jason

+0

Тогда скажите пожалуйста, что не работает? Вызывается ли 'UnhookWindowHookEx'? Вы не проверяете возвращаемые значения. – Sinatr

ответ

1

Я не хочу, чтобы увидеть терминатор x напечатанного в Блокноте

Тогда не называйте следующий крюк в цепи:

return CallNextHookEx(_hookID, nCode, wParam, lParam); 

Идеи зацепиться установить собственный обработчик до существующих обработчиков (от winapi). Перехватывая (как вы делаете это уже), вы не только прослушиваете, но все же вызываете предыдущие обработчики с этим вызовом.

Попробуйте что-то вроде (непроверенные):

if(vkCode == 88) 
{ 
    ... 
    return 0; 
} 
+0

Спасибо. Я попробую. – Jason

+0

Хммм .. Я добавил «return (IntPtr) 1;». Это выглядит неплохо. Но сама программа все еще работает (позади). Как я могу бросить его навсегда? Благодарю. – Jason

+0

* «Программа сама по себе работает» * - это еще одна проблема. 'Application.Run()' это WPF? – Sinatr