Я хочу сделать RC и удалять его с помощью последовательной связи. Я хочу:
Я делаю код, но он не работает, когда я нажимаю A и W вместе. Код не отправил '1010', а только отправил '1000'
private void SEND_KeyPress(object sender, KeyPressEventArgs e)
{
string tx;
if (e.KeyChar == (char)Keys.W & e.KeyChar == (char)Keys.A)
{
tx = "1010";
serialPort1.Write(tx);
}
if (e.KeyChar == (char)Keys.W & e.KeyChar == (char)Keys.D)
{
tx = "1001";
serialPort1.Write(tx);
}
if (e.KeyChar == (char)Keys.S & e.KeyChar == (char)Keys.A)
{
tx = "0110";
serialPort1.Write(tx);
}
if (e.KeyChar == (char)Keys.W & e.KeyChar == (char)Keys.A)
{
tx = "0101";
serialPort1.Write(tx);
}
if (e.KeyChar == (char)Keys.W)
{
tx = "1000";
serialPort1.Write(tx);
}
if (e.KeyChar == (char)Keys.S)
{
tx = "0100";
serialPort1.Write(tx);
}
if (e.KeyChar == (char)Keys.A)
{
tx = "0010";
serialPort1.Write(tx);
}
if (e.KeyChar == (char)Keys.D)
{
tx = "0001";
serialPort1.Write(tx);
}
}
//DetectCombination like this:
public DateTime PrevPress { get; set; }
public DateTime CurrentPress { get; set; }
public string PrevKey { get; set; }
private void SEND_KeyPress(object sender, KeyPressEventArgs e)
{
string keycomb = DetectCombination(e.KeyChar.toString);
}
public string DetectCombination(string currentKey)
{
CurrentPress = DateTime.Now;
if(CurrentPress.CompareTo(PrevPress) < //100ms)
{
PrevKey+=currentKey;
}
else
{
PrevKey = currentKey;
PrevPress = CurrentPress;
}
return PrevKey;
}
//Для применения вашей логики потребуется еще одна функция, но, похоже, вы позаботились об этом.
A и W никогда не могут быть действительно нажаты одновременно, независимо от того, сколько вы попробуете, они будут отключены. Один всегда случается перед другим. Keypress срабатывает для каждого нажатия клавиши.
Вам необходимо подписаться на keydown и keyup. Когда происходит сбой, записывайте ключ, который был нажат в хеш-листе. Когда происходит проверка ключа, проверьте, содержит ли хеш-лист A и W, а затем отправьте 1010.
Всегда проверяйте наивысшую комбинацию клавиш, прежде чем обрабатывать более короткие комбинации клавиш, а затем отдельные клавиши. Важно сделать это в Keyup, потому что пользователю нужен шанс нажать все клавиши вниз, которые идут вместе и удерживают их. Если вы попытаетесь сделать это в keydown, у вас будет такая же проблема (всегда по одному за раз).
A и W никогда не могут быть действительно нажаты одновременно, сначала проверьте W, а затем проверьте A, наконец, передайте значение 1010
if (e.KeyChar == (char) Keys.W)
{
if(e.KeyChar == (char)Keys.A)
{
tx = "1010";
serialPort1.Write(tx);
}
}
Происходит, когда персонаж. пробел или клавиша Backspace нажата, когда управление имеет фокус.
Этот обработчик событий запускается один раз за ключ. Это означает, что эта строка
if (e.KeyChar == (char)Keys.W & e.KeyChar == (char)Keys.A)
Всегда будет оценивать значение false
. Не говоря уже о том, что переменная не может быть сразу нескольких значений.
Поэтому, если вы хотите обнаружить несколько ключей, вам придется делать это по-другому. Одним из способов может быть каждый раз, когда вы нажимаете клавишу, сохранять значение в буфере, сначала проверяя, имеет ли буфер уже значение, и если да, измените значение отправки соответственно. Затем запустите таймер, поэтому каждый раз, когда таймер истечет, он отправит все данные в буфер, а затем очистит его.
if (e.KeyChar == (char)Keys.W & e.KeyChar == (char)Keys.A)
? Вы, вероятно, имеете в виду,if (e.KeyChar == (char)Keys.W && e.KeyChar == (char)Keys.A)
. Обратите внимание, что когдаe.KeyChar == (char)Keys.W
имеет значениеtrue
,e.KeyChar == (char)Keys.A
имеет значениеfalse
и наоборот. Это означает, что все выражение всегда возвращаетfalse
&
отлично подходит для этого в C #.