public void Dispose()
        {
            if (_hook != IntPtr.Zero)
            {
                Interop.User32.UnhookWindowsHookEx(_hook);
                _hook = IntPtr.Zero;
            }

            _proc = null;
        }
        public KeyboardProvider()
        {
            var threadId = Interop.Kernel32.GetCurrentThreadId();

            _proc = HookProc;

            _hook = Interop.User32.SetWindowsHookEx(
                Interop.User32.HookType.WH_KEYBOARD,
                _proc,
                IntPtr.Zero,
                threadId);

            _keyboardLayout = Interop.User32.GetKeyboardLayout(threadId);
        }