Laden...

Tastatureingaben manipulieren

Erstellt von JLafleur vor 16 Jahren Letzter Beitrag vor 16 Jahren 1.336 Views
J
JLafleur Themenstarter:in
49 Beiträge seit 2007
vor 16 Jahren
Tastatureingaben manipulieren

moin.

jeder hat sicherlich schonmal bemerkt, dass man die tastatur unter windows auf europäisch umstellen kann, und damit ein Y zu einem Z wird, und andersrum.

ich möchte nun ein programm schreiben, welches die tastatureingaben beliebig manipuliert.

also wenn ich ein B drücke, soll ein CCC erscheinen, global natürlich.

die ersten schritte bin ich schon mit dem thread
Programm reagiert nach einer Zeit nicht mehr auf Tastatureingaben
gegangen.
damit kann ich überprüfen, ob eine bestimmte taste gedrückt (hier nur losgelassen) wurde.

jetzt möchte ich gerne diese eingabe verwerfen,
und stattdessen C C C in den tasturbuffer schreiben, oder ans system senden, oder wie auch immer.
so dass jede application dies für bare münze nimmt, und entsprechend reagiert.

schließt sich ein fokussiertes programm bspw. durch drücken von ALT+x
so möchte ich bei einem gedrückten x (Alt + x) ans system übergeben, und damit die application schließen.

meine fragen sind also

  1. wie schreibe ich einen key ins system
  2. wie verhindere ich, dass dadurch wieder ein event meines programms gestartet wird.
    bsp. ich möchte bei der eingabe A - AA ins system schreiben
    ein A würde aber wieder das event auslösen (sehe ich doch richtig oder?) und somit würde es eine endlosschleife geben.
    ich würde tippen, dass ich entweder X ms den thread oder die methode schlafen lege, oder aber abfrage ob ein A gedrückt wurde, und auf die nächsten X eingaben nicht mehr reagiere, indem ich eine variable hochzähle.

die 2. frage sollte wohl eher hinten anstehen, da man selbst mit 300+ tastaturanschlägen pro sekunde nur jede 30ms eine taste drückt, und das system wohl in 5ms mit den eingaben fertig ist.

mfg
JLafleur

3.430 Beiträge seit 2007
vor 16 Jahren

moin, oder besser guten abend =)

ich habe mir mal eine Eingabetastatur gebastelt. und dabei war es oftmals notwendig die Shift-Taste zu drücken bzw. loszulassen. und dafür habe ich dieses Codestück verwendet. Damit kannst du die Tasten drücken bzw loslassen.


        [DllImport("user32.dll")]
        static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, UIntPtr dwExtraInfo);

            const int KEYEVENTF_EXTENDEDKEY = 0x1;
            const int KEYEVENTF_KEYUP = 0x2;
            keybd_event((byte)Keys.ShiftKey, 0x45, KEYEVENTF_EXTENDEDKEY, (UIntPtr)0); //Shift-Taste drücken
            keybd_event((byte)Keys.ShiftKey, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, (UIntPtr)0); //Shift-Taste los lassen

zu punkt zwei:
Ob das Event auch durch das hier ausgelöst wird kann ich dir nicht genau sagen, da ich es nicht getestet habe.
Falls es immer ausgelöst wird, so kannst du dir ja einfach merken wenn ein User eine Taste drückt, dann weisst du was darauf folgt.
Wenn der User z.B. A drückt dann weisst du genau, dass durch dein Programm nun drei weitere A folgen.

mfg
MichlG

J
JLafleur Themenstarter:in
49 Beiträge seit 2007
vor 16 Jahren

moin moin;

also so recht schlau werd ich aus deinem code net....
wie soll ich den denn verwenden?
du hast quasi key-datas deklariert, die also eine gedrückte oder losgelassene shift-taste darstellen.
wenn ich das richtig verstanden habe, müsste ich die per SendKey senden - oder?

um mal den praktischen grund für dieses experiment zu nennen (man kann es nat. auch auf sämtliche andere probleme anwenden)

need for speed pro street *fg
man muss bei der manuellen schaltung erst kuppen (gedrückt halten) dann schalten (hoch oder runter) dann die kupplung loslassen.

mein ziel ist es nun, aus K (kuppen)(gedrückt halten) + H (hochschalten drücken) + K(kuppeln loslassen)
nur ein H zu bauen - also hochschalten, das programm erkennt dass hochgeschaltet werden soll, sendet also ein gedrücktes K (kuppeln) ein gepresstest H (drücken, loslassen) und ein losgelassenes K (kuppeln).

ich weiß, für n doofes spiel n bissl viel aufwand, aber generell hab ich mich eh schon immer gefragt wie globale keys funktionieren.
also das allseits bekannte strg+alt+entf oder auch windows-taste+pause.

sowas einbauen zu können ist sicherlich nie verkehrt....

wobei ich da noch ne frage hätte.....
nehmen wir mal 2 programme A und B
das eine ist ein..... druckprogramm, was bei.... strg+p den aktuellen screen druckt.
das andere ist ein musikprogramm, nennen wir es mal WUNamp 😜
das bei strg+S das aktuelle stück stoppt.

in dem oben angebgen thread wird der fokus auf das programm gelegt,
also alle tastatureingaben gehen zuerst an das programm.
soweit erstmal nicht schlimm, vll (ich hoffe es doch) werden ja die nicht matchenden tastaturfolgen einfach im raume stehen gelassen, und andere programme können sich "bedienen".
wie sieht es aber aus, wenn WUNamp nun durch strg+p die playlist einblenden soll?
also 2 identische tastaturfolgen von 2 verschiedenen programmen benutzt werden?

und vll zusätzlich windows (ich weiß es grad net) ebenfalls bei strg+p z.b..... Paint öffnen soll?

fragen über fragen 🙂
ich werde nu erstmal.... gleich.... also... nicht jetzt... sondern.... halt später....
schlafen gehen 🙂

JL