C# 低级键盘挂钩自动安装并降低计算机速度?
我在桌面应用程序中使用键盘低级挂钩来监视用户活动。下面给出了我用于钩子的代码。 在这段代码中(据我所知),当我必须开始监视用户活动时,我调用C# 低级键盘挂钩自动安装并降低计算机速度?,c#,desktop-application,keyboard-hook,C#,Desktop Application,Keyboard Hook,我在桌面应用程序中使用键盘低级挂钩来监视用户活动。下面给出了我用于钩子的代码。 在这段代码中(据我所知),当我必须开始监视用户活动时,我调用SetHook()这将安装hook,并且我可以监视键盘上按下的键。当我想停止捕获密钥时,我只调用UnHook()方法 问题是,当我的应用程序启动时(SetHook()method尚未调用),我的应用程序会自动安装挂钩,这会减慢系统的运行速度。系统每1分钟挂起2-3秒 为了诊断这个问题,我注释掉了下面提到的所有代码和安装的应用程序。现在这个系统运行得非常好 我
SetHook()
这将安装hook,并且我可以监视键盘上按下的键。当我想停止捕获密钥时,我只调用UnHook()方法
问题是,当我的应用程序启动时(SetHook()
method尚未调用),我的应用程序会自动安装挂钩,这会减慢系统的运行速度。系统每1分钟挂起2-3秒
为了诊断这个问题,我注释掉了下面提到的所有代码和安装的应用程序。现在这个系统运行得非常好
我不知道为什么会这样
SetHook()
方法,我的应用程序也开始捕获密钥public static class WinKeyCapture5 {
private const int WH_KEYBOARD_LL = 13;
private const int WM_KEYDOWN = 0x0100;
private static LowLevelKeyboardProc _proc = HookCallback;
public static DateTime LastKeyPressTime;
public static void SetHook()
{
SetHook(_proc);
}
public static void UnHook()
{
UnhookWindowsHookEx(_hookID);
}
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 _hookID = IntPtr.Zero;
private delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam);
private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
{
//if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN)
//{
int vkCode = Marshal.ReadInt32(lParam);
//if (vkCode == 44)
//ScreenCapture.Load();
LastKeyPressTime = System.DateTime.Now;
//}
return CallNextHookEx(_hookID, nCode, wParam, lParam);
}
[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);
}
这个钩子的响应性主要取决于消息循环的泵送程度。您没有包含的代码。@Hans Passant,我正在使用钩子计算用户的非活动时间。您可以看到>LastKeyPressTime=System.DateTime.Now;我在代码中使用LastKeyPressTime来检查用户何时按下键盘上的按钮。我还想提到我在按钮的单击事件中调用SetHook()方法。问题是我还没有点击那个按钮,我只是启动了应用程序,它减慢了我的系统。若我对上面提到的所有代码进行注释,然后运行应用程序,那个么它不会降低我的系统速度。你们必须使用钩子,或者你们可以使用其他解决方案来计算用户的非活动时间?我们可以使用任何方法来计算非活动时间。使用钩子不是强制性的。