2016-01-22 1 views
0

Я пробыл весь день здесь, но почти никогда не задавал никаких вопросов; вы, ребята, так хороши, что я не чувствую себя достойным (:Борьба за использование секундомера в клавиатурном крюке

У меня есть это приложение, которое я сделал некоторое время назад, с которого я недавно начал работать. Он записывает макрос мыши и воспроизводит его, он отлично работал для использование, которое я бы сделал с этим, но я начал ощущать необходимость добавления клавиатурных штрихов тоже.

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

Я пробовал много разных способов запустить секундомер там, но все, что касается этого куска кода, вызывает у меня дискомфорт. Слушатель для ключа должен иметь разделение для keyup и keydown, но как я могу использовать таймер с этим?

В любом случае, пожалуйста, изо всех сил.


Проблема, я попытался instanciating секундомера глобально (Form1 сфера), который должен:

  1. запустить время метод 1, перейти к KeyDown состояния, запустить таймер,
  2. затем выполните еще один раз, перейдите к настройке и остановите таймер.

Я думал, что это должно работать, но я думаю, что у меня есть проблемы с областью, учитывая, что таймер никогда не дает точной стоимости. (Нажатие 3 секунд дает 1, после этого быстрое нажатие и отпускание дает 3) Я проверил, будет ли таймер запускаться и останавливаться в нужное время, и я думаю, что это так.

Впоследствии я попытался внедрить его в метод крюка, но поскольку он должен дважды запустить его, чтобы записать & вниз, таймер сбрасывается. (написав его, как это, я могу подумать, может быть, мне стоит просто проверить, работает ли он, а не инстанцировать его, если это так)

Я не тороплюсь и действительно не ищу просто быстрый способ решить эту проблему, скорее ищу лучший способ реализовать эту функцию и попытаться сделать эту программу немного более аккуратной. У меня такое чувство, что это путь, и я должен использовать lParam, который упростит его.


хранить данные в нажатие там, хотя я думаю, что на самом деле LPARAM делает это более эффективно, не мог понять, как это работает, хотя

public class KeyPressHelper 
{ 
    public Keys currentPressedKeyCode; 
    public Keys currentReleasedKeyCode; 
    public Keys previousPressedKeyCode; 

    public KeyPressHelper() 
    { 
     currentPressedKeyCode = new Keys(); 
     currentReleasedKeyCode = new Keys(); 
     previousPressedKeyCode = new Keys(); 
    } 
} 

это функция крючок, большинство из них просто образец кода, предоставленный msdn, я добавил условие для keyup, но im действительно не уверен, что это действительно правильный путь.

private static IntPtr HookCallback(
     int nCode, IntPtr wParam, IntPtr lParam) 
    { 
     if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN) 
     { 
      keyStrokeTimer.Start(); // global Stopwatch 

      //keypresshelper kph1 
      kph1.previousPressedKeyCode = 0; 
      kph1.currentReleasedKeyCode = 0; 
      int vkCode = Marshal.ReadInt32(lParam); 

      kph1.currentPressedKeyCode = (Keys)vkCode; 
      kphList.Add(kph1); 
     } 
     if (nCode >= 0 && wParam == (IntPtr)WM_KEYUP) 
     { 
      //assign kph2.previousPressedkey to kph1.currentPressedKey 
      kph2.previousPressedKeyCode 
= kphList.Find(k => k.Equals(kph1)).currentPressedKeyCode; 

      kph2.currentPressedKeyCode = 0; 
      int vkCode = Marshal.ReadInt32(lParam); 
      kph2.currentReleasedKeyCode = (Keys)vkCode; 

      //if they're identical well this is nice. 
      if (kph2.previousPressedKeyCode == kph2.currentReleasedKeyCode) 
      { 
       keyStrokeTimer.Stop(); 
       MessageBox.Show("" + keyStrokeTimer.ElapsedMilliseconds)  //goal. 
      } 
      else 
      { 
       keyStrokeTimer.Stop(); 
      } 
     } 
     return CallNextHookEx(_hookID, nCode, wParam, lParam); 

    } 
+0

И проблема в том, что ...? –

+0

Я отредактировал вопрос извините, если он был расплывчатым. – mwoa

ответ

0

Давайте посмотрим на Stopwatch класс documentation

По умолчанию, истекшее значение времени секундомера экземпляра равна сумме всех измеренных интервалов времени.Каждый вызов Start начинает отсчет в кумулятивное истекшее время; каждый вызов Stop останавливает измерение текущего интервала и замораживает кумулятивное значение прошедшего времени. Используйте метод «Сброс», чтобы очистить кумулятивное прошедшее время в существующем экземпляре секундомера.

Как вы понимаете, как вы его используете, ваш Stopwatch накапливает общее время. Если вы хотите измерить время между двумя событиями, используйте метод Restart вместо Start.

+0

Спасибо, я попробую его чуть позже и отправлю обратно, как это происходит. (не удалось выполнить git при выходе из работы: l) – mwoa