2011-08-06 16 views
0

私のアプリケーション用のAFKCheckerが現在作成中です。 問題は、低レベルのマウスフックが呼び出されないということです。 私はそれが0でないかどうかをチェックしました。 キーボードフックは機能しますが、マウスフックは機能しません。 私はグーグルでは、私はまだ私の問題の解決策を見つけていない。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

あなたは再確認し、あなたのAddHook()機能、SetMouseHookを呼び出していないように思える:

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

oh stupid me。私はそれを変えるのを忘れた – BlackVoid

2

だけのアイドル時間を見つけるために、マウス/キーボードフックをインストールしますユーザーは概念的に間違っていると私を襲う。これは、Windowsが優れたAPIを提供していない場合に限り、最後の手段になるはずです。

quick searchは、この目的のために設計されたGetLastInputInfo APIを示しています。 C#でそれを行う方法を説明しているコードプロジェクトの記事:Getting the user idle time with C#

関連する問題