public void Stop()
        {
            lock (_locker)
            {
                if (_isRunning)
                {
                    if (_mouseHook != null)
                    {
                        Task.Factory.StartNew(() =>
                        {
                            _mouseHook.MouseAction -= MouseGetter;
                            _mouseHook.Stop();
                            _mouseHook = null;
                        },
                                              CancellationToken.None,
                                              TaskCreationOptions.None,
                                              _shf.GetTaskScheduler());
                    }

                    _mouseQueue.Enqueue(false);
                    _isRunning = false;
                    _taskCancellationTokenSource.Cancel();
                }
            }
        }
        public void Start()
        {
            lock (_locker)
            {
                if (!_isRunning)
                {
                    _taskCancellationTokenSource = new CancellationTokenSource();
                    _mouseQueue = new QueueHookConcurrentAsync <object>(_taskCancellationTokenSource.Token);
                    Task.Factory.StartNew(() =>
                    {
                        _mouseHook              = new MouseEventHook();
                        _mouseHook.MouseAction += MouseGetter;
                        _mouseHook.Start();
                    },
                                          CancellationToken.None,
                                          TaskCreationOptions.None,
                                          _shf.GetTaskScheduler()).Wait();

                    Task.Factory.StartNew(() => ConsumeKeyAsync());

                    _isRunning = true;
                }
            }
        }