/// <summary> /// Gets the input locale identifier for the active application's thread. Using this combined with the ToUnicodeEx and /// MapVirtualKeyEx enables Windows to properly translate keys based on the keyboard layout designated for the /// application. /// </summary> /// <returns>HKL</returns> private static IntPtr GetActiveKeyboard() { IntPtr hActiveWnd = ThreadNativeMethods.GetForegroundWindow(); //handle to focused window int dwProcessId; int hCurrentWnd = ThreadNativeMethods.GetWindowThreadProcessId(hActiveWnd, out dwProcessId); //thread of focused window return(GetKeyboardLayout(hCurrentWnd)); //get the layout identifier for the thread whose window is focused }
private static HookResult HookApp(int hookId, Callback callback) { HookProcedure hookProcedure = (code, param, lParam) => HookProcedure(code, param, lParam, callback); var hookHandle = HookNativeMethods.SetWindowsHookEx( hookId, hookProcedure, IntPtr.Zero, ThreadNativeMethods.GetCurrentThreadId()); if (hookHandle.IsInvalid) { ThrowLastUnmanagedErrorAsException(); } return(new HookResult(hookHandle, hookProcedure)); }