Я пробыл весь день здесь, но почти никогда не задавал никаких вопросов; вы, ребята, так хороши, что я не чувствую себя достойным (:Борьба за использование секундомера в клавиатурном крюке
У меня есть это приложение, которое я сделал некоторое время назад, с которого я недавно начал работать. Он записывает макрос мыши и воспроизводит его, он отлично работал для использование, которое я бы сделал с этим, но я начал ощущать необходимость добавления клавиатурных штрихов тоже.
Итак, сегодня я добавил эту функцию, которая записывает штрихи клавиатуры, я могу поймать штрихи и показать их, но моя проблема связана с фактом что я хочу запустить секундомер, который начинается с нажатия клавиши и заканчивается при отпускании клавиши. Кроме того, я должен убедиться, что клавиша, которую я нажимаю, и клавиша, которую я выпускаю, - это те же, которые я надеюсь, что это действительно так.
Я пробовал много разных способов запустить секундомер там, но все, что касается этого куска кода, вызывает у меня дискомфорт. Слушатель для ключа должен иметь разделение для keyup и keydown, но как я могу использовать таймер с этим?
В любом случае, пожалуйста, изо всех сил.
Проблема, я попытался instanciating секундомера глобально (Form1 сфера), который должен:
- запустить время метод 1, перейти к KeyDown состояния, запустить таймер,
- затем выполните еще один раз, перейдите к настройке и остановите таймер.
Я думал, что это должно работать, но я думаю, что у меня есть проблемы с областью, учитывая, что таймер никогда не дает точной стоимости. (Нажатие 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);
}
И проблема в том, что ...? –
Я отредактировал вопрос извините, если он был расплывчатым. – mwoa