Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
9 / 9 / 1
Регистрация: 28.02.2013
Сообщений: 208
1

Отловить двойное нажатие клавиши вне формы

21.07.2014, 03:44. Показов 2376. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть программа в трее, есть глобальный хук, который, при нажатии на клавишу, разворачивает ее. Хук может отловить нажатие одной клавиши KeyDown и KeyUp. Как мне в текущих обстоятельствах отловить именно быстрое двойное нажатие клавиши? Как я понимаю, при нажатии нужной кнопки нужно запустить некий таймер на ~пол секунды и при повторном нажатии клавиши это будет расцениваться как двойное нажатие. Интересует реализация этого таймера или что-то наподобие его)

Добавлено через 43 минуты
сделал уже. Вот пару процедур связанные с кликом
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
 public Form1()
        {
            InitializeComponent();
            this.ShowInTaskbar = false;
            Hooks.KBDHook.KeyDown += new Hooks.KBDHook.HookKeyPress(KBDHook_KeyDown); //хук
            Hooks.KBDHook.LocalHook = false; //хук
            Hooks.KBDHook.InstallHook(); //хук
            time.Interval = 500; //интервал пол секунды
            time.Tick += time_Tick; //метод вызывается при срабатывании таймера
            
 
        }
public Timer time = new Timer(); //таймер
        public bool doubleClick = false; //флажок
 
void time_Tick(object sender, EventArgs e)
        {
            doubleClick = false;
        }
 
void KBDHook_KeyDown(Hooks.LLKHEventArgs e)
        {
 
            if (e.Keys == Keys.RShiftKey)
                keyPressed();
            else
                doubleClick = false;
 
        }
 
void keyPressed()
        {
            if(doubleClick)
            {
                this.Show();
                this.WindowState = FormWindowState.Normal;
            }
            else
            {
                doubleClick = true;
                time.Enabled = true;
            }
                
        }
сори за некрасивый код, не было времени исправлять
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.07.2014, 03:44
Ответы с готовыми решениями:

Создание HotKeys (Отловить нажатие клавиши Esc)
Добрый день, товарищи. Подскажите советом - создана форма с BorderStyle = None, на ней лежит во...

Отловить нажатие клавиши клавиатуры из другого аккаунта Windows
Может, вопрос глупый, но задам... Пишу на C#. Устанавливаю глобальный хук на клавиатуру. Все...

Не могу отловить нажатие клавиши Delete
void ElementsGrid_KeyDown(object sender, KeyEventArgs e) { if (e.Key ==...

Отловить нажатие левой клавиши мыши вне своего приложения
Привет всем, в общем наткнулся на такую проблему, нужно отловить нажатие ЛКМ, если оно произошло ...

3
8940 / 4852 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
21.07.2014, 05:49 2
Лучший ответ Сообщение было отмечено goremukin как решение

Решение

По-моему, таймер здесь лишний. Запоминаешь момент времени, когда кнопка была отпущена (первое нажатие) и сравниваешь со временем,когда была нажата (второе нажатие). Если разница во времени меньше заданного интервала — значит, двойное нажатие. Псевдо-код:
C#
1
2
3
4
5
6
7
8
DateTime firstPressTime;
void KeyUp(){
    firstPressTime = DateTime.Now;
}
void KeyDown(){
    if ((int)DateTime.Now.Subtract(firstPressTime).TotalMilliseconds <= 500)
        DoubleKeyPressEvent();
}
1
9 / 9 / 1
Регистрация: 28.02.2013
Сообщений: 208
21.07.2014, 11:01  [ТС] 3
Вот такая мысль тоже была, но я не был уверен, что DateTime точный до миллисекунд. Спасибо, так гораздо проще
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
21.07.2014, 15:20 4
Лучший ответ Сообщение было отмечено goremukin как решение

Решение

goremukin, там точность около 50-100 мс по-моему. Для дабл клика обычно достаточно, хотя не всегда (задержка в 100 мс в онлайн-игре очень заметна).

Добавлено через 1 минуту
чтобы получить точное время, используйте такой код:
C#
1
long time = Stopwatch.GetTimestamp();
в остальном все аналогично примеру выше.

тут точность в сотни наносекунд по-моему.
1
21.07.2014, 15:20
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.07.2014, 15:20
Помогаю со студенческими работами здесь

Двойное нажатие клавиши
Доброй ночи. Пишу программу, в которой по двойному нажатию Esc происходит действие. На данный...

Отловить нажатие клавиши
Вообщем помогите отловить через вин апи нажатие клавиши. Программа хоть и свернута все равно должна...

Отловить нажатие клавиши в консоли
Здравствуйте! Необходимо отловить нажатие клавиши пробел или Enter, когда я не нахожусь в...

Как в консольном приложении отловить нажатие определённой клавиши?
Как в консольном приложении отловить нажатие определённой клавиши?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru