Как определить, что клавиша ctrl нажата дважды, если программа свернута или в системном трее - PullRequest
1 голос
/ 02 марта 2012

Как обнаружить нажатие клавиши ctrl дважды, если программа свернута или в системном трее

Я пытаюсь разработать программу на c #, в которой основная форма будет отображаться пользователю при двойном нажатии клавиши управления. Я нашел образцы комбинаций горячих клавиш, но это не горячие клавиши с комбинацией, как, например, control + некоторая другая клавиша. Это похоже на приложение Google Desktop, где окно поиска отображается при двойном нажатии клавиши управления.

Ответы [ 5 ]

1 голос
/ 02 марта 2012

Перехват клавиатуры, как предлагается. Это было приятно для вас на CodePlex , где вы получаете .NET API, просто вызывающий события Key и Mouse, независимо от состояния, в котором находится ваше приложение.

1 голос
/ 02 марта 2012

Что вы можете сделать - это захватывать каждый раз, когда нажимается клавиша, и, возможно, в фоновом режиме сравнивать разницу во времени.

Установите себе порог, и если он меньше этого, вы бы его рассмотрелиДважды нажмите и сделайте все, что вам нужно.

Непроверенные компоненты могут выглядеть примерно так:

    private readonly DateTime _originDateTime = new DateTime(0);
    private DateTime _lastKeyPress;

Рабочий работник:

        _backgroundWorker = new BackgroundWorker { WorkerSupportsCancellation = false };
        _backgroundWorker.DoWork += DoBackgroundWork;
        _backgroundWorker.RunWorkerAsync();

Реализация метода DoBackgroundWork:

    private void DoBackgroundWork(object sender, DoWorkEventArgs doWorkEventArgs)
    {
        do
        { 
                if (_lastKeyPress != _originDateTime)
                {
                    Thread.Sleep(DelayInMilliseconds);
                    DateTime now = DateTime.Now;

                    TimeSpan delta = now - _lastKeyPress;

                    if (delta < new TimeSpan(0, 0, 0, 0, DelayInMilliseconds))
                    {
                        continue;
                    }
                }

                //do stuff

        } while (true);
    }

И не забудьте захватить ключ:

    private void SomeEvent_KeyDown(object sender, KeyEventArgs e)
    {
        _lastKeyPress = DateTime.Now;
    }

Это основано на XPath Visualizer

1 голос
/ 02 марта 2012

Используйте зацепки клавиатуры, как предложено foxx1337, затем сделайте что-то вроде этого:

int triggerThreshold = 500; //This would be equivalent to .5 seconds
int lastCtrlTick = 0;

private void OnCtrlPress()
{
    int thisCtrlTick = Environment.TickCount;
    int elapsed = thisCtrlTick - lastCtrlTick;
    if (elapsed <= triggerThreshold)
    {
        LaunchYourAppOrWhatever();
    }
    lastCtrlTick = thisCtrlTick;
}
1 голос
/ 02 марта 2012

Это похоже на случай перехвата клавиатуры (WH_KEYBOARD).

0 голосов
/ 24 января 2018

ОБНОВЛЕНИЕ: Библиотека библиотек управляемых оболочек .NET, упомянутая в принятом ответе, перемещена сюда .Теперь также доступен пакет nuget MouseKeyHook .

Недавно была добавлена ​​поддержка для определения сочетаний клавиш, комбинаций клавиш и последовательностей.Вот пример использования:

void DoSomething()
{
    Console.WriteLine("You pressed UNDO");
}

Hook.GlobalEvents().OnCombination(new Dictionary<Combination, Action>
{
    {Combination.FromString("Control+Z"), DoSomething},
    {Combination.FromString("Shift+Alt+Enter"), () => { Console.WriteLine("You Pressed FULL SCREEN"); }}
});

Для получения дополнительной информации см .: Обнаружение комбинаций клавиш и Seuqnces

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...