c # - hook keyboard: hvordan man får navnet på programmet, hvor nøglen trykkes?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg lavede et simpelt hook-tastatur i C #, så jeg har følgende kode:


        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("
");
        }
        return CallNextHookEx(hKeyboardHook, nCode, wParam, lParam);
    }


Det virker fint uden problem !! mit program greb alle tastetryk i andet program og skrive det på konsollen.
Men jeg vil gerne have navnet på programmet, hvor nøglen er presset, og jeg ved ikke, hvordan jeg kan gøre det.


Nogen kan hjælpe mig?

Bedste reference


Du bruger en lavtstående krog (WH\_KEYBOARD\_LL). Koblinger på lavt niveau sendes, inden vinduets leder bestemmer hvilket program der vil modtage beskeden. Derfor er der ikke noget navn på programmet, hvor nøglen trykkes på, fordi vinduets leder endnu ikke har bestemt hvilket program tastaturet skal leveres til. (Du kan prøve at gætte ved at kalde GetForegroundWindow.)


(Bare nysgerrig: Hvad er det ultimative problem, du forsøger at løse ved at bruge et tastaturkrog? Måske er der en bedre måde. Jeg håber du ikke skriver en keylogger.)