2016-01-22 26 views
0

我在這裏呆了一整天,但幾乎沒有問過任何問題;你們是如此之好,我不覺得值得(努力在鍵盤鉤內使用秒錶

我有這個應用程序,我做了一段時間,最近我再次開始工作。 它記錄一個鼠標點擊宏並重播它,它工作非常好但我開始覺得還需要增加鍵盤筆劃

所以今天我添加了這個函數來記錄鍵盤筆畫,我可以捕捉筆畫並顯示它們,但是我的問題與事實有關我想運行一個秒錶,開始時按鍵開始,並在鍵釋放結束 除此之外,我應該確保我按的鍵和我釋放的密鑰是相同的,我希望這實際上是它

我嘗試了很多不同的方式在那裏運行秒錶,但是關於這段代碼的一切讓我感到不舒服。該鍵的監聽器應該爲keyup和keydown分離,但是如何使用這個計時器呢?

請盡一切努力,全力以赴。


問題是,我試圖instanciating秒錶全局(Form1的範圍),其應:

  1. 運行的方法1時,轉到KEYDOWN條件,啓動計時器,
  2. 然後再運行一次,進入關鍵幀並停止計時器。

我認爲這應該工作,但我想我有範圍問題,考慮到計時器永遠不會給出準確的價值。 (按3秒鐘1,然後快速按下並釋放3)我檢查計時器是否開始並在正確的時間停止,我認爲它確實如此。

之後我試着在掛鉤方法中實例化它,但是因爲它必須運行兩次才能記錄下井號&,計時器被重置。 (寫它是這樣的我圖也許我應該只是檢查它是否運行,而不是instanciate它,如果是的話)

我並不急於尋找只是一個快速的方法來解決這個問題,而是尋找實現此功能並嘗試使此程序稍微整齊的最佳方式。我有一種感覺,這種方式不對,我應該使用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的條件,但我真的不知道這是實際的正確方法。

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

讓我們來看看Stopwatchdocumentation

默認情況下,一個秒錶實例的經過時間值等於總所有測量時間間隔。每次調用開始時都會從累計經過時間開始計數;每次調用Stop都會結束當前的間隔測量並凍結累計的經過時間值。使用重置方法清除現有秒錶實例中的累計已用時間。

正如您所見,您使用它的方式,您的Stopwatch正在累計總時間。如果您想測量兩次事件之間的時間,請使用Restart方法而不是Start

+0

謝謝,我會稍後再嘗試一下,並回復它是如何發生的。 (離開工作時失敗的git提交:l) – mwoa