Gå til innhold

C#: Håndtere mange samtidige keystrokes


Anbefalte innlegg

Jeg lager et program som er avhengig av å kunne lese mange tastetrykk samtidig (bruker KeyDown og KeyUp eventene), men den PC-en jeg lager dette på registrerer ikke flere enn to tastetrykk samtidig. Jeg har også prøvd med GetAsyncKeyState(), med akkurat samme resultat.

 

Er det noe jeg kan gjøre med dette, eller må jeg bare godta at det er slik?

Lenke til kommentar
Videoannonse
Annonse
La meg omformulere: en måte som ikke involverer P/Invoke. Oss som ikke har en lang bakgrunn fra C++ er muligens mer komfortable med ren, enkel C#. Men greit, da konkluderer jeg med at svaret er "nei".

Du kan bruke managed Directx / directinput, dette eksempelet leste av 10k ganger i sekundet her. :p

 

Prøvde å skrive det så rent og enkelt som mulig, om du får loaderlock exception skru det av med ctrl-alt-e -> Managed Debugging Assistants og kryss av Loaderlock.

 

using System;
using System.Text;
using System.Windows.Forms;
using System.Threading;

//Husk å legg til dll filen i References også, følger med i Directx SDK
using Microsoft.DirectX.DirectInput; 

namespace dxkeysimple
{
   public partial class mainform : Form
   {
       Device keyboard;
       Thread t;
       public mainform()
       {
           InitializeComponent();

    //Skaff keyboard enheten
           keyboard = new Device(SystemGuid.Keyboard);
           keyboard.SetDataFormat(DeviceDataFormat.Keyboard);

    //La den kjøre som background og nonexclusive 
          //så den ikke bare leser taster når programmet har focus
           keyboard.SetCooperativeLevel(this, CooperativeLevelFlags.Background | 
           CooperativeLevelFlags.NonExclusive);

           keyboard.Acquire();


           t = new Thread(Proccesskeys);
           t.Start();
       }

       void Proccesskeys()
       {
           while (true)
           {
               Key[] keys = keyboard.GetPressedKeys();
	//For eksempel les det av til en richtextbox
               richTextBox1.Invoke((System.Action)delegate 
	{ 
		foreach(Key k in keys)
		richTextBox1.Text += k.ToString(); 
	});
           }
       }

       private void mainform_FormClosing(object sender, FormClosingEventArgs e)
       {
           t.Abort();
       }
   }
}

Husk å legg til en richTextBox1 om du kopierer hele.

Endret av Ndzy
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...