Comment puis-je détecter si l'utilisateur maintient la touche Space en C #?
En C ++, vous ajouteriez & 0x8000 comme & 0x8000 :
[DllImport("user32.dll")]
public static extern short GetAsyncKeyState(Keys key);
while (true)
{
if (GetAsyncKeyState(Keys.Space) & 0x8000)
{
Console.WriteLine("User is holding Space!");
}
}
J'ai essayé de faire la même chose en C # mais je ne suis pas allé loin:
while (true)
{
if (GetAsyncKeyState(VK_SPACE) & 0x8000)
{
std::cout << "User is holding Space!";
}
}
Qu'est-ce que je fais de mal et comment puis-je détecter si l'utilisateur maintient la barre d'espace enfoncée?
3 Réponses :
Avec une simple application console, cela fonctionne (sauf la condition IF où vous devez vérifier la valeur, c # ne peut pas convertir les valeurs numériques en condition booléenne):
public partial class Form1 : Form
{
[DllImport("user32.dll")]
public static extern short GetAsyncKeyState(int key);
bool spaceIsPressed = false;
Thread t = null;
public Form1()
{
InitializeComponent();
t = new Thread(CheckKey);
t.Start();
}
public void CheckKey()
{
try
{
while (true)
{
if ((GetAsyncKeyState(32) & 0x8000) > 0)
{
spaceIsPressed = true;
}
else
{
if (spaceIsPressed)
spaceIsPressed = false;
}
Thread.Sleep(200);
}
}
catch (ThreadInterruptedException ex) { }
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (t != null)
{
t.Interrupt();
t = null;
}
}
}
Si vous souhaitez l'utiliser sur un formulaire Windows, vous devez le faire sur un thread d'arrière-plan pour ne pas geler l'application avec elle et la stocker dans une propriété ou déclencher un événement vers le thread principal, cela dépend du cas d'utilisation.
Un exemple pour l'utiliser dans WinForms
class Program
{
[DllImport("user32.dll")]
public static extern short GetAsyncKeyState(int key);
static void Main(string[] args)
{
while (true)
{
if ((GetAsyncKeyState(32) & 0x8000) > 0)
{
Console.WriteLine("User is holding Space!");
}
}
}
}
En C #, vous pouvez le faire de la même manière que vous l'avez fait en C ++, mais le code du bouton sera différent.
Répondre:
En C #, nous utilisons des codes de clé virtuelle. Pour chaque bouton, il y a un code. Pour la barre d'espace, c'est 0x20
La liste complète que vous pouvez trouver sur la page de Microsoft:
https://docs.microsoft.com/pl-pl/windows/win32/inputdev/virtual-key-codes?redirectedfrom=MSDN
vous pouvez également vérifier:
private void Form2_KeyUp(object sender, System.Windows.Forms.KeyEventArgs e)
{
if (!Keyboard.IsKeyDown(Key.Space))
{
spaceKeyDown = false;
}
}
private void Form2_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
if (e.KeyCode == Keys.Space)
{
spaceKeyDown = true;
}
}
mais vous pouvez également vous inscrire aux événements KeyDown \ Up:
KeyDown += Form2_KeyDown; KeyUp += Form2_KeyUp;
puis vérifiez si la clé est un espace ... de cette façon, vous n'avez pas à boucler en arrière-plan:
while (true)
{
if (Keyboard.IsKeyDown(Key.Space))
{
Console.WriteLine("User is holding Space!");
}
}
Vous voudrez peut-être vérifier d'autres questions comme stackoverflow.com/questions/22837510/… ou stackoverflow.com/questions/18874380/...
Pourquoi n'utilisez-vous pas:
if (Keyboard.IsKeyDown(Key.Space)) {}