110,536
社区成员
发帖
与我相关
我的任务
分享
[StructLayout(LayoutKind.Sequential)]
public struct KBDLLHOOKSTRUCT
{
public int vkCode;
public int scanCode;
public int flags;
public int time;
public int dwExtraInfo;
}
public class HookApi
{
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr SetWindowsHookEx
(
int hookid,
HookBase.HookPro pfnhook,
IntPtr hinst,
int threadid
);
[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
public static extern bool UnhookWindowsHookEx
(
IntPtr hhook
);
[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
public static extern bool CallNextHookEx
(
IntPtr hhook,
int code,
IntPtr wparam,
IntPtr lparam
);
[DllImport("Kernel32.dll", EntryPoint = "RtlMoveMemory")]
public static extern void CopyMemory
(
ref KBDLLHOOKSTRUCT Source,
IntPtr Destination, int Length
);
public class HookBase
{
public delegate bool HookPro(int nCode, IntPtr wParam, IntPtr lParam);
static IntPtr hHook = IntPtr.Zero;
const int WH_KEYBOARD_LL = 13;
GCHandle _hookProcHandle;
public delegate void keypresscode(int keycode, int modifierkeys);
public keypresscode curkeypresscode;
public bool KEYBOARD_HOOKPRO(int nCode, IntPtr wParam, IntPtr lParam)
{
KBDLLHOOKSTRUCT kb = new KBDLLHOOKSTRUCT();
HookApi.CopyMemory(ref kb, lParam, 20);
if (kb.vkCode == 91) { return true; }
UNLOAD_WINDOWS_KETBOARD_HOOK();
SET_WINDOWS_KEYBOARD_HOOK();
return HookApi.CallNextHookEx(hHook, nCode, wParam, lParam); }
public void SET_WINDOWS_KEYBOARD_HOOK()
{
if (hHook == IntPtr.Zero)
{
HookPro hk = new HookPro(this.KEYBOARD_HOOKPRO);
_hookProcHandle = GCHandle.Alloc(hk);
hHook = HookApi.SetWindowsHookEx(
WH_KEYBOARD_LL,
hk,
Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]),
0);
if (hHook == IntPtr.Zero)
{
throw new Exception("安装钩子不成功!");
}
}
}
public void UNLOAD_WINDOWS_KETBOARD_HOOK()
{
if (hHook != IntPtr.Zero)
{
HookApi.UnhookWindowsHookEx(hHook);
_hookProcHandle.Free();
hHook = IntPtr.Zero;
}
}
}
}
public class HookBase
{
public delegate bool HookPro(int nCode, IntPtr wParam, IntPtr lParam);
static IntPtr hHook = IntPtr.Zero;
const int WH_KEYBOARD_LL = 13;
GCHandle _hookProcHandle;
public delegate void keypresscode(int keycode, int modifierkeys);
public keypresscode curkeypresscode;
public bool KEYBOARD_HOOKPRO(int nCode, IntPtr wParam, IntPtr lParam)
{
KBDLLHOOKSTRUCT kb = new KBDLLHOOKSTRUCT();
HookApi.CopyMemory(ref kb, lParam, 20);
if (kb.vkCode == 91) { return true; }
UNLOAD_WINDOWS_KETBOARD_HOOK();
SET_WINDOWS_KEYBOARD_HOOK();
return HookApi.CallNextHookEx(hHook, nCode, wParam, lParam);
}
public void SET_WINDOWS_KEYBOARD_HOOK()
{
if (hHook == IntPtr.Zero)
{
HookApi.HookBase.HookPro hk = new HookApi.HookBase.HookPro(this.KEYBOARD_HOOKPRO);
_hookProcHandle = GCHandle.Alloc(hk);
hHook = HookApi.SetWindowsHookEx(
WH_KEYBOARD_LL,
hk,
Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]),
0);
if (hHook == IntPtr.Zero)
{
throw new Exception("安装钩子不成功!");
}
}
}
public void UNLOAD_WINDOWS_KETBOARD_HOOK()
{
if (hHook != IntPtr.Zero)
{
HookApi.UnhookWindowsHookEx(hHook);
_hookProcHandle.Free();
hHook = IntPtr.Zero;
}
}
}