我在這裏呆了一整天,但幾乎沒有問過任何問題;你們是如此之好,我不覺得值得(努力在鍵盤鉤內使用秒錶
我有這個應用程序,我做了一段時間,最近我再次開始工作。 它記錄一個鼠標點擊宏並重播它,它工作非常好但我開始覺得還需要增加鍵盤筆劃
所以今天我添加了這個函數來記錄鍵盤筆畫,我可以捕捉筆畫並顯示它們,但是我的問題與事實有關我想運行一個秒錶,開始時按鍵開始,並在鍵釋放結束 除此之外,我應該確保我按的鍵和我釋放的密鑰是相同的,我希望這實際上是它
我嘗試了很多不同的方式在那裏運行秒錶,但是關於這段代碼的一切讓我感到不舒服。該鍵的監聽器應該爲keyup和keydown分離,但是如何使用這個計時器呢?
請盡一切努力,全力以赴。
問題是,我試圖instanciating秒錶全局(Form1的範圍),其應:
- 運行的方法1時,轉到KEYDOWN條件,啓動計時器,
- 然後再運行一次,進入關鍵幀並停止計時器。
我認爲這應該工作,但我想我有範圍問題,考慮到計時器永遠不會給出準確的價值。 (按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);
}
問題是...? –
我編輯的問題抱歉,如果它是模糊的。 – mwoa