2011-08-06 56 views
0

我目前正在爲我的應用程序創建一個AFKChecker。 問題是,低級別的鼠標鉤不會被調用。 我檢查過它是否返回0。 所以鍵盤鉤子工作,但不是鼠標鉤子。 我已經使用Google,但我仍然沒有找到解決我的問題的方法。WW_MOUSE_LL掛鉤不被調用

using System; 
using System.Diagnostics; 
using System.Runtime.InteropServices; 

namespace AFKChecker 
{ 
    public static class ActivityChecker 
    { 
     public static Int64 LastKeypress = 0; 
     public static int AFKTime = 300; 

     private const int WH_KEYBOARD_LL = 13; 
     public const int WH_MOUSE_LL = 14; 
     private static HookProc _keyproc = HookCallback; 
     private static IntPtr _keyhookID = IntPtr.Zero; 
     private static HookProc _mouseproc = HookCallback; 
     private static IntPtr _mousehookID = IntPtr.Zero; 

     public static void AddHook() 
     { 
      LastKeypress = Tools.UnixTime(); 
      _keyhookID = SetKeyboardHook(_keyproc); 
      _mousehookID = SetKeyboardHook(_mouseproc); 
     } 

     private static IntPtr HookCallback(
     int nCode, IntPtr wParam, IntPtr lParam) 
     { 
      LastKeypress = Tools.UnixTime(); 
      return CallNextHookEx(_keyhookID, nCode, wParam, lParam); 
     } 

     public static void RemoveHook() 
     { 
      UnhookWindowsHookEx(_keyhookID); 
      UnhookWindowsHookEx(_mousehookID); 
     } 

     public static Boolean IsAFK() 
     { 
      return (LastKeypress + AFKTime > Tools.UnixTime()); 
     } 

     private static IntPtr SetKeyboardHook(HookProc proc) 
     { 
      using (Process curProcess = Process.GetCurrentProcess()) 
      using (ProcessModule curModule = curProcess.MainModule) 
      { 
       return SetWindowsHookEx(WH_KEYBOARD_LL, proc, 
        GetModuleHandle(curModule.ModuleName), 0); 
      } 
     } 

     private static IntPtr SetMouseHook(HookProc proc) 
     { 
      using (Process curProcess = Process.GetCurrentProcess()) 
      using (ProcessModule curModule = curProcess.MainModule) 
      { 
       return SetWindowsHookEx(WH_MOUSE_LL, proc, 
        GetModuleHandle(curModule.ModuleName), 0); 
      } 
     } 

     private delegate IntPtr HookProc(
      int nCode, IntPtr wParam, IntPtr lParam); 

     [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
     private static extern IntPtr SetWindowsHookEx(int idHook, 
      HookProc 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

好像你不打電話SetMouseHook,重新檢查你的AddHook()功能:

public static void AddHook() 
    { 
     LastKeypress = Tools.UnixTime(); 
     _keyhookID = SetKeyboardHook(_keyproc); 
     _mousehookID = SetKeyboardHook(_mouseproc); // SetMouseHook() here? 
    } 
+0

哦,我愚蠢。我忘了改變這一點 – BlackVoid