2012-02-22 14 views
0

私はC#で簡単なフックキーボードを作ったので、私はこの次のコードを持っている:フックキーボード:キーが押された場所のプログラム名を取得するには?

 private static IntPtr hKeyboardHook = IntPtr.Zero; 
     private const int WH_KEYBOARD_LL = 13; 
     private const int WM_KEYDOWN = 0x100; 

     private delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam); 
     [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
     private static extern IntPtr SetWindowsHookEx(int idHook, LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId); 
     [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall, SetLastError = true)] 
     private static extern int UnhookWindowsHookEx(IntPtr idHook); 
     [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
     private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam); 
     [DllImport("user32")] 
     private static extern int ToAscii(int uVirtKey, int uScanCode, byte[] lpbKeyState, byte[] lpwTransKey, int fuState); 
     [DllImport("user32")] 
     private static extern int GetKeyboardState(byte[] pbKeyState); 
     [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] 
     private static extern short GetKeyState(int vKey); 
     private delegate int HookProc(int nCode, int wParam, IntPtr lParam); 
     [DllImport("kernel32.dll")] 
     public static extern IntPtr GetModuleHandle(string lpModuleName); 
     private static LowLevelKeyboardProc _proc = HookCallback; 

public void initialization() 
     { 
      using (Process curProcess = Process.GetCurrentProcess()) 
       using (ProcessModule curModule = curProcess.MainModule) 
       { 
        hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, _proc, GetModuleHandle(curModule.ModuleName), 0); 
       } 
     } 

    private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam) 
    { 
     if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN) 
     { 
      int vkCode = Marshal.ReadInt32(lParam); 
      if (vkCode >= 32 && vkCode < 160) 
       Console.Write((Keys)vkCode); 
      if (vkCode == 13) 
       Console.WriteLine("\n"); 
     } 
     return CallNextHookEx(hKeyboardHook, nCode, wParam, lParam); 
    } 

それは問題なく正常に動作します!私のプログラムは、他のプログラムで押されたすべてのキーをつかみ、それをコンソールに書き込みます。 しかし、私はキーが押された場所のプログラムの名前を持ちたいと思います。どうすればいいのか分かりません。

誰でも手伝ってもらえますか?

答えて

2

低レベルのフック(WH_KEYBOARD_LL)を使用しています。ウィンドウマネージャがメッセージを受け取るプログラムを決定する前に、低レベルのフックが送出されます。したがって、キーマネージャがどのキーを押すかをまだ決定していないので、「キーが押されたプログラムの名前」はありません。 (GetForegroundWindowに電話して推測してみてください)

(ちょっと興味があります:キーボードフックを使用して解決しようとしている究極の問題は何でしょうか? keylogger)

+0

私はC#を学んでいます。それは良い運動だと思います。 Buf私は低レベルのフックでそれを行うことができない場合は、それは重要ではない –

+0

私はあなたがちょうど学んでいる場合は、少し単純なものを選択することをお勧めします。キーロガーは実際にはかなり難しいです。 –

関連する問題