我目前正在爲我的應用程序創建一個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);
}
}
問候
哦,我愚蠢。我忘了改變這一點 – BlackVoid