Страница 1 из 2

время удерживания клавиши

Добавлено: 18 сен 2009, 14:40
BattleMage
здравствуйте, обращаюсь к вам со следующим вопросом. нужно измерить время удерживания клавиши. как это сделать?
я так понимаю надо во время события KeyDown по компоненту textBox включить таймер, чтобы пошёл отчёт времени, а когда будет отпущена (KeyUp), таймер остановить и вычесть из последнего времени первое. это верно? или может надо событие KeyPress использовать?

как засекать время? есть какая-нить WinAPI функция для этого?

Re: время удерживания клавиши

Добавлено: 18 сен 2009, 22:01
Newbie
BattleMage писал(а):здравствуйте, обращаюсь к вам со следующим вопросом. нужно измерить время удерживания клавиши. как это сделать?
я так понимаю надо во время события KeyDown по компоненту textBox включить таймер, чтобы пошёл отчёт времени, а когда будет отпущена (KeyUp), таймер остановить и вычесть из последнего времени первое. это верно? или может надо событие KeyPress использовать?

как засекать время? есть какая-нить WinAPI функция для этого?
ппц изврат....

не проще тогда уже получить время так...
private: System::Void textBox1_KeyPress(System::Object^ sender, System::Windows::Forms::KeyPressEventArgs^ e)
{
start = DateTime::Now;
}
private: System::Void textBox1_KeyUp(System::Object^ sender, System::Windows::Forms::KeyEventArgs^ e)
{
this->Text = (DateTime::Now - start).ToString();
}

без разницы какой проект... логика одна получить текущее время системы.

Re: время удерживания клавиши

Добавлено: 18 сен 2009, 23:46
Romeo
Таймер действительно излишен. Достаточно замерить время в WM_KEYDOWN и замерить время в WM_KEYUP, затем посчитать разницу.

Re: время удерживания клавиши

Добавлено: 19 сен 2009, 02:16
BattleMage
хм. вроде работает, но только часто показывает одинаковые значения... не верится, что такое возможно...ладно бы если в секундах, а тут измеряется в процессорных тактах (100-наносекунды)

468750
781250
156250
312500
937500
468750
937500
937500
1718750
937500
781250

это слово в 11 букв (время на каждую)

какие мысли?

Re: время удерживания клавиши

Добавлено: 19 сен 2009, 09:58
_SG
Теоретически это неверно, ибо после нажатия кнопки, событие попадает в очередь событий и сколько оно там провисит, пока будет вызвана обработка, одному богу известно(

Re: время удерживания клавиши

Добавлено: 19 сен 2009, 10:21
BattleMage
Теоретически это неверно, ибо после нажатия кнопки, событие попадает в очередь событий и сколько оно там провисит, пока будет вызвана обработка, одному богу известно(
а как управлять этой очередью? можно же поставить максимальный приоритет, чтобы выполнялось сразу же

Re: время удерживания клавиши

Добавлено: 19 сен 2009, 13:18
_SG
Да всё будет нормально. Это я просто теоретически предположил. На самом деле в Windows отдан приоритет событиям ввода (мышь и клавиатура) и когда поток проверяет что там у него в очереди сообщений, WM_KEYDOWN(UP) будут отбработы в первую очередь.

Re: время удерживания клавиши

Добавлено: 19 сен 2009, 15:35
BattleMage
ну всё равно. как это сделать? может и не для этого случая, просто знать на будущее. раз вопрос этот затронут, то когда-нить опять всплывёт...
заранее спасибо)

Re: время удерживания клавиши

Добавлено: 09 окт 2009, 07:14
atavin-ta
BattleMage писал(а):здравствуйте, обращаюсь к вам со следующим вопросом. нужно измерить время удерживания клавиши. как это сделать?
я так понимаю надо во время события KeyDown по компоненту textBox включить таймер, чтобы пошёл отчёт времени, а когда будет отпущена (KeyUp), таймер остановить и вычесть из последнего времени первое. это верно? или может надо событие KeyPress использовать?

как засекать время? есть какая-нить WinAPI функция для этого?
Бред. Когда событие попадёт в обработчик, часть времени уже пройдёт. Причём, время реакции на события up и down может здорово не совпасть, на разницу будет ошибка. Тебе надо в обих обработчиках прочитать из самих сообщений, если там есть такая инфа, время их отправки и вычесть. А если если в сообщениях такой инфы нет, то задача нерешаема.
&quot писал(а): 468750
781250
156250
312500
937500
468750
937500
937500
1718750
937500
781250
Здесь время просто округлено не до единиц, а до большего числа, так что вполне возможно. Если измерять время в пикосекундах, округлять результат до триллионов, а само время будет различаться на сотни миллисекунд, то результаты тоже совпадут.

Re: время удерживания клавиши

Добавлено: 09 окт 2009, 10:05
Albor
atavin-ta писал(а):Бред. Когда событие попадёт в обработчик, часть времени уже пройдёт.
О чём спор!? Начнём с того, что кнопки нажимаются человеком а не автоматом, поэтому говорить о пико/нано секундах и времени простоя сообщения в очереди не корректно. atavin-ta, вы ещё не учли время реакции клавишной пружины и силу трения пластиковых частей, а эти параметры у каждой кнопки свои :) .