111,094
社区成员




public struct KBDLLHOOKSTRUCT
{
public int vkCode;
int scanCode;
public int flags;
int time;
int dwExtraInfo;
}
public delegate IntPtr KeyboardHookProc(int nCode, IntPtr wParam, ref KBDLLHOOKSTRUCT lParam);
public KeyboardHookProc HookProc;
public static IntPtr hHookHandle = IntPtr.Zero;
public const int WH_MOUSE_LL = 14;
public const int WH_KEYBOARD_LL = 13;
private const int WM_KEYDOWN = 0x0100;
private const int WM_SYSKEYDOWN = 0x0104;
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall, SetLastError = true)]
public static extern IntPtr SetWindowsHookEx(int idHook, KeyboardHookProc lpfn, IntPtr hMod, uint dwThreadId);
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall, SetLastError = true)]
public static extern bool UnhookWindowsHookEx(IntPtr idHook);
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall, SetLastError = true)]
private static extern IntPtr CallNextHookEx(IntPtr idHook, int nCode, IntPtr wParam, ref KBDLLHOOKSTRUCT lParam);
private void button1_Click(object sender, EventArgs e)
{
setKeyboardHook();
}
public void setKeyboardHook()
{
if (hHookHandle == IntPtr.Zero)
{
HookProc = new KeyboardHookProc(HookCallback);
hHookHandle = SetWindowsHookEx(WH_KEYBOARD_LL, HookProc, Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]), 0);
if (hHookHandle == IntPtr.Zero)
{
MessageBox.Show("SetWindowsHookEx Failed");
return;
}
button1.Text = "Uninstall Hook";
}
else
{
if (!UnhookWindowsHookEx(hHookHandle))
{
MessageBox.Show("UnhookWindowsHookEx Failed");
return;
}
hHookHandle = IntPtr.Zero;
button1.Text = "Install Hook";
}
}
private IntPtr HookCallback(int nCode, IntPtr wParam, ref KBDLLHOOKSTRUCT lParam)
{
if (nCode >= 0 && (wParam == (IntPtr)WM_KEYDOWN || wParam == (IntPtr)WM_SYSKEYDOWN)) //仅捕获KeyDown事件
{
//这里可以加上你窗体的操作代码。
MessageBox.Show("you press key: " + lParam.vkCode.ToString());
//return (IntPtr)0;
}
return CallNextHookEx(hHookHandle, nCode, wParam, ref lParam);
}