我需要捕获全局键盘消息,所以我使用SetWindowsHookEx()和WH_KEYBOARD_LL。但它只适用于应用程序关注焦点并且不会触发全局回调。几乎相同的代码与mouse_LL很好(与另一个结构&等)请帮助!全局键盘钩
public const int WH_KEYBOARD_LL = 13;
public const int VK_INSERT = 0x2D;
public delegate int HookProc(int nCode, IntPtr wParam, IntPtr lParam);
HookProc KeyboardHookProcedure;
[DllImport("user32.dll", CharSet = CharSet.Auto,
CallingConvention = CallingConvention.StdCall)]
public static extern int SetWindowsHookEx(int idHook, HookProc lpfn,
IntPtr hInstance, int threadId);
[DllImport("user32.dll", CharSet = CharSet.Auto,
CallingConvention = CallingConvention.StdCall)]
public static extern bool UnhookWindowsHookEx(int idHook);
[DllImport("user32.dll", CharSet = CharSet.Auto,
CallingConvention = CallingConvention.StdCall)]
public static extern int CallNextHookEx(int idHook, int nCode,
IntPtr wParam, IntPtr lParam);
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr GetModuleHandle(string lpModuleName);
[StructLayout(LayoutKind.Sequential)]
private struct KBDLLHOOKSTRUCT
{
public uint vkCode;
public uint scanCode;
public uint flags;
public uint time;
public IntPtr dxExtraInfo;
}
private void SetHookKeyboard()
{
if (kHook == 0)
{
KeyboardHookLL();
//If the SetWindowsHookEx function fails.
if (kHook == 0)
{
MessageBox.Show("SetWindowsHookEx Failed");
return;
}
button1.Text = "UnHook Windows Hook";
}
else
{
bool ret = UnhookWindowsHookEx(kHook);
//If the UnhookWindowsHookEx function fails.
if (ret == false)
{
MessageBox.Show("UnhookWindowsHookEx Failed");
return;
}
kHook = 0;
this.Text = "Keyboard Hook";
}
}
private void KeyboardHookLL()
{
KeyboardHookProcedure = new HookProc(MainForm.KeyboardHookProc);
kHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardHookProcedure, GetModuleHandle("user32"), 0);
}
public static int KeyboardHookProc(int nCode, IntPtr wParam, IntPtr lParam)
{
KBDLLHOOKSTRUCT MyKeyboardHookStruct = (KBDLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(KBDLLHOOKSTRUCT));
if (nCode < 0)
{
return CallNextHookEx(hHook, nCode, wParam, lParam);
}
else
{
Form tempForm = Form.ActiveForm;
tempForm.Text = MyKeyboardHookStruct.vkCode.ToString();
if (MyKeyboardHookStruct.vkCode == VK_INSERT)
{
MainForm.botAlive = false;
MessageBox.Show(MainForm.botAlive.ToString());
}
return CallNextHookEx(hHook, nCode, wParam, lParam);
}
}
一般来说,使用热键而不是挂钩更安全。为什么你需要一个钩子而不是一个热键有没有特别的理由? – Guido 2013-03-21 12:52:08
Yeap,我需要捕捉每一个输入,因为它将成为一个“记录器”。 – UnknitSplash 2013-03-21 12:59:51
如果这是你的mainform的代码,那么你不应该注册事件处理程序吗? – Guido 2013-03-22 08:37:12