Если у меня нажата клавиша, а затем я нажимаю клавишу Alt, событие KeyUp не срабатывает для нажатой клавиши до тех пор, пока я в следующий раз не нажму повторяющуюся клавишу, то есть «ааааааааа...». Это похоже на то, что если вы не используете события деактивации или потери фокуса и нажимаете кнопку, удерживаемая вами клавиша продолжает действовать.
Я пробовал использовать клавишу предварительного просмотра вниз и клавишу предварительного просмотра вверх до ловить нажатия клавиши Alt. Я даже пробовал отпускать каждую клавишу при нажатии клавиши Alt, но между нажатием клавиши Alt и остановкой другой клавиши была задержка.
Мне это не обязательно нужно. чтобы отключить такие вещи, как Alt+F4. Я намеренно не использую клавишу Alt для каких-либо целей в своем приложении. Но пользователь может нажать клавишу Alt и столкнуться с этой проблемой.
Я попробовал еще несколько вещей, которые нашел здесь, но другие у меня в голове.Я не хочу проверять IsKeyDown для каждого ключа, если это можно сделать.
Вот код WinForms, позволяющий нарисовать куб и повернуть его, если 'x' равен 'x'. держал. Если alt+x удерживается и отпускается, код продолжает работать. У меня такая же проблема и в WPF.
public partial class Form1 : Form
{
private float rotationAngle = 0;
private bool rotationKeyDown = false;
public Form1()
{
InitializeComponent();
timer1.Interval = 32;
timer1.Start();
}
public struct Point3D
{
public float X, Y, Z;
public Point3D(float x, float y, float z)
{
X = x;
Y = y;
Z = z;
}
}
public class Matrix4x4
{
private float[,] matrix = new float[4, 4];
public static Matrix4x4 CreateRotationY(float angle)
{
Matrix4x4 result = new Matrix4x4();
result.matrix[0, 0] = result.matrix[2, 2] = (float)Math.Cos(angle);
result.matrix[0, 2] = (float)Math.Sin(angle);
result.matrix[2, 0] = -(float)Math.Sin(angle);
result.matrix[1, 1] = result.matrix[3, 3] = 1;
return result;
}
public Point3D MultiplyPoint(Point3D p)
{
return new Point3D(
p.X * matrix[0, 0] + p.Y * matrix[0, 1] + p.Z * matrix[0, 2],
p.X * matrix[1, 0] + p.Y * matrix[1, 1] + p.Z * matrix[1, 2],
p.X * matrix[2, 0] + p.Y * matrix[2, 1] + p.Z * matrix[2, 2]
);
}
}
private void Form1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
if (e.KeyCode == Keys.X && Control.ModifierKeys == Keys.Alt)
{
e.IsInputKey = true;
}
}
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.X)
{
rotationKeyDown = true;
}
}
private void Form1_KeyUp(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.X)
{
rotationKeyDown = false;
}
}
private void timer1_Tick(object sender, EventArgs e)
{
if (rotationKeyDown == true)
{
rotationAngle += 10;
this.Invalidate();
}
}
private void Form1_Paint(object sender, PaintEventArgs e)
{
DrawCube(e.Graphics, this.ClientSize.Width / 2, this.ClientSize.Height / 2);
}
private void DrawCube(Graphics g, int cx, int cy)
{
int side = 100;
Point3D[] vertices = {
new Point3D(-1, -1, -1),
new Point3D(1, -1, -1),
new Point3D(1, 1, -1),
new Point3D(-1, 1, -1),
new Point3D(-1, -1, 1),
new Point3D(1, -1, 1),
new Point3D(1, 1, 1),
new Point3D(-1, 1, 1)
};
Matrix4x4 rotationMatrix = Matrix4x4.CreateRotationY(rotationAngle * (float)Math.PI / 180);
Point[] projectedPoints = new Point[vertices.Length];
for (int i = 0; i < vertices.Length; i++)
{
Point3D rotated = rotationMatrix.MultiplyPoint(vertices);
projectedPoints = IsoProject(rotated, cx, cy, side);
}
int[] edges = { 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 };
for (int i = 0; i < edges.Length; i += 2)
{
g.DrawLine(Pens.Black, projectedPoints[edges], projectedPoints[edges[i + 1]]);
}
}
private Point IsoProject(Point3D p, int cx, int cy, int scale)
{
float x = p.X - p.Y;
float y = p.X + p.Y - 2 * p.Z;
return new Point((int)(cx + x * scale / 2), (int)(cy + y * scale / 2));
}
}
Подробнее здесь: https://stackoverflow.com/questions/783 ... yup-events
Клавиша Alt пропускает события KeyDown, KeyUp [закрыто] ⇐ C#
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Фокус ввода ввода на Keydown Приводит к тому, что клавиша будет вводить в поле ввода
Anonymous » » в форуме Javascript - 0 Ответы
- 6 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Клюки, Keydown и Keypress события не работают на мобильных устройствах
Anonymous » » в форуме Jquery - 0 Ответы
- 6 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Клюки, Keydown и Keypress события не работают на мобильных устройствах
Anonymous » » в форуме Jquery - 0 Ответы
- 5 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Клюки, Keydown и Keypress события не работают на мобильных устройствах
Anonymous » » в форуме Jquery - 0 Ответы
- 6 Просмотры
-
Последнее сообщение Anonymous
-