private void KeyboardWatcherThreadWork()
        {
            if (Application.OpenForms.Count == 0)
            {
                return;
            }
            Keyboard keyboard = null;

            using (var directInput = new DirectInput())
            {
                try
                {
                    keyboard = new Keyboard(directInput);
                    keyboard.SetCooperativeLevel(Application.OpenForms.Count == 0 ? null : Application.OpenForms[0], CooperativeLevel.Background | CooperativeLevel.Nonexclusive);
                    keyboard.Properties.BufferSize = 255;
                    keyboard.Acquire();
                    var lastKeyboardState    = new bool[Enum.GetValues(typeof(Key)).Length];
                    var currentKeyboardState = new bool[Enum.GetValues(typeof(Key)).Length];
                    while (true)
                    {
                        try
                        {
                            var curState     = keyboard.GetCurrentState();
                            var possibleKeys = Enum.GetValues(typeof(Key));

                            var i = 0;
                            foreach (Key thisKey in possibleKeys)
                            {
                                currentKeyboardState[i] = curState.IsPressed(thisKey);
                                i++;
                            }

                            i = 0;
                            foreach (Key thisKey in possibleKeys)
                            {
                                var isPressedNow     = currentKeyboardState[i];
                                var wasPressedBefore = lastKeyboardState[i];
                                if (isPressedNow && !wasPressedBefore)
                                {
                                    var winFormsKey =
                                        (Keys)NativeMethods.MapVirtualKey((uint)thisKey, NativeMethods.MAPVK_VSC_TO_VK_EX);
                                    AddExtendedKeyInfo(winFormsKey);
                                    var eventArgs = new KeyEventArgs(winFormsKey);
                                    _keyDownEventHandler.HandleKeyDownEvent(this, eventArgs);
                                }
                                i++;
                            }
                            Array.Copy(currentKeyboardState, lastKeyboardState, currentKeyboardState.Length);
                        }
                        catch (Exception e)
                        {
                            _log.Debug(e.Message, e);
                        }
                        Thread.Sleep(50);
                    }
                }
                catch (ThreadInterruptedException)
                {
                }
                catch (ThreadAbortException)
                {
                    Thread.ResetAbort();
                }
                catch (Exception e)
                {
                    _log.Error(e.Message, e);
                }
                finally
                {
                    if (keyboard != null)
                    {
                        try
                        {
                            keyboard.Unacquire();
                        }
                        catch { }

                        try
                        {
                            Common.Util.DisposeObject(keyboard);
                        }
                        catch { }

                        keyboard = null;
                    }
                }
            }
        }