Mit tastendruck eine andere taste simulieren

Hallo,
ich versuche mir ein Programm zu schreiben, das wenn ich eine taste drücke, wird dem system vorgegaukelt, das eine andere gedrückt wird.
also die Taste die tatsächlich gedrückt wird soll in einem textfeld eingegeben werden können.
und dann soll beim druck auf dieser taste der druck auf die 1 simuliert werden nach 3 mal dann die 2 und nach weiteren 3 mal die 3
am besten wäre wenn man dann noch eine liste von häkchen hätte, wo man dann an oder abklicken kann welche gedrückt werden soll, von 1-9 und 0
wenn man also das häkchen aus dem kästchen 1 entfernt dann wird nur noch 2-9 und 0 simuliert.

Naja ich habe schon gesucht, aber ich weiß nicht mal wonach ich da suchen muss.

Danke schonmal.

MFG McKaiver

Hallo,

starte das mal und tippe auf das ‚a‘.

Option Explicit

Private Sub Text1\_KeyPress(KeyAscii As Integer)
 Static n As Integer
 If KeyAscii = 97 Then
 n = n + 1
 If n \> 9 Then n = 0
 KeyAscii = 48 + n
 End If
End Sub

Gruß, Rainer

Hallo,
oh das sieh ja sehr einfach aus aber leuchtet ein, das problem ist nur das ich nicht so viel ahnung davon habe ich habe das script in die Form eingefügt, das hat leider nicht funktioniert, muss ich da noch Variable einfügen oder die taste definieren?

der müsste auch die taste 1 zum beispiel 3 mal drücken bevor er nach 2 ausweicht.
also ungefähr so:

Tastendruck:
e-e-e-e-e-e-e-q-----e-e
1-1-1-2-2-2-3-reset-1-1

wenn das gehen würde wäre es schon perfekt

ich arbeite mit VB 6

Hallo,

oh das sieh ja sehr einfach aus

ist es auch. :smile:

aber leuchtet ein, das problem
ist nur das ich nicht so viel ahnung davon habe ich habe das
script in die Form eingefügt, das hat leider nicht
funktioniert, muss ich da noch Variable einfügen oder die
taste definieren?

Der Code erwartet eine TextBox auf der Form, die Text1 heißt. Beim Start bekommt die Textbox den Focus, das muß auch so bleiben, sonst funktioniert der Code nicht.

der müsste auch die taste 1 zum beispiel 3 mal drücken bevor
er nach 2 ausweicht.
also ungefähr so:

Tastendruck:
e-e-e-e-e-e-e-q-----e-e
1-1-1-2-2-2-3-reset-1-1

wenn das gehen würde wäre es schon perfekt

Ja, das geht. Aber was soll da plötzlich das ‚q‘ und was soll ‚reset‘ bewirken? Willst Du noch ein paar andere Tasten ‚umleiten‘, eine Parser bauen? Oder geht es wirklich nur um die Taste ‚e‘ und die Folge der Ausgabe ‚1112223‘ und ein ‚reset‘??? Textfeld löschen und die Zeichen neu eingeben, das Spiel neu beginnen? Das ist leicht.

Wenn es das ist, maile ich Dir am Besten den Quellcode, dann kannst Du nichts falsch machen. OK?

ich arbeite mit VB 6

Das ist schon mal shön, ich auch. :smile:

Eine Frage noch, weil Du keine Textbox auf die Form gelegt hast … wo sollen die Zeichen denn ausgegeben werden? Du willst das Programm doch nicht etwa im Hintergrund laufen lassen und die Eingabe und Ausagabe der Zeichen in einem anderen Programm vornehmen? Das wäre extrem aufwändig.

Wenn ich etwas falsch verstanden habe, beschreibe Dein Problem möglichst genau, so detailliert wie möglich.

Gruß, Rainer

Hallo,

ich habe das mal nach Deiner Beschreibung zusammengebaut.

Auf die Form mußt Du eine Textbox legen, die Text1 heißt.

Nach dem Start hat Text1 den Focus, ich habe verhindert, daß sich das ändert. Wenn Du also z.B. noch einen Button auf die Form legst, kannst Du den nicht anklicken!

  • Die Taste ‚q‘ löscht den Inhalt der textbox und stellt das Programm auf ‚Anfang‘.
  • Tippst Du auf die Taste ‚e‘ wird ein Zeichen eingefügt. Zuerst eine 1 dann eine weitere und dann eine dritte. Dann eine 2 und so weiter.
  • alle anderen Tasten werden ignoriert

Es wird nur eine Drei ausgegeben, danach werden alle weiteren Tasten ignoriert, bis ‚q‘ gedrückt wird und das Spiel von vorn geginnt.

Bei Gelegenheit könntest Du mal verraten, wozu das gut sein soll, mir fällt dazu nichts ein. :smile:

Gruß, Rainer

'Auf der Form muß eine Texbox mit dem Namen
'Text1 liegen

Option Explicit

Private Sub Text1\_KeyPress(KeyAscii As Integer)
 Static n As Integer
 Static cnt As Integer
 If KeyAscii = 101 Then
 Select Case n
 Case 2
 cnt = cnt + 1
 If cnt \>= 2 Then
 cnt = 2
 KeyAscii = 0
 Else
 KeyAscii = 49 + n
 End If
 Case 1
 KeyAscii = 49 + n
 cnt = cnt + 1
 If cnt \>= 3 Then
 cnt = 0
 n = n + 1
 End If
 Case 0
 KeyAscii = 49 + n
 cnt = cnt + 1
 If cnt \>= 3 Then
 cnt = 0
 n = n + 1
 End If
 End Select
 ElseIf KeyAscii = 113 Then
 KeyAscii = 0
 cnt = 0
 n = 0
 Text1.Text = ""
 Else
 KeyAscii = 0
 End If
End Sub

Private Sub Text1\_LostFocus()
 Text1.SetFocus
End Sub

doch genau das habe ich vor :smiley:

es soll dazu dienen dass ich in einem spiel nur noch das „e“ drücken muss und dann nach und nach die slots 1-0(0 ist dabei hinter der 9) verbraucht werden. und wenn ich nur bis 5 gekommen bin ein mal alles wieder auffüllen und von vorne beginnen.

aber so wie das funktioniert hat lief das schon TOP!

Hallo,

doch genau das habe ich vor :smiley:

es soll dazu dienen dass ich in einem spiel nur noch das „e“
drücken muss und dann nach und nach die slots 1-0(0 ist dabei
hinter der 9) verbraucht werden. und wenn ich nur bis 5
gekommen bin ein mal alles wieder auffüllen und von vorne
beginnen.

… ich hab’s befürchtet. Dann brauchst Du das hier …

http://www.activevb.de/tipps/vb6tipps/tipp0589.html

… aber Vorsicht! Erst ganz genau lesen! Du darfst das Programm beim Testen z.B. nicht mit der IDE stoppen, Du darfst keine Fehler einbauen, sonst kann Dir der Comuter abstürzen. Du begibst Dich damit in einen Bereich, der mit VB zwar machbar ist, für den VB aber eigentlich nicht gedacht war. Deshalb kann sich VB da schon mal ‚zickig‘ benehmen. Ich habe erst ein Programm mit Subclassing geschrieben, da kenne ich mich auch noch nicht aus.

Sieh es Dir erst mal an, ob Du das selbst anpassen kannst. Ich experimentiere gelegentlich auch mal damit, aber nicht hier. Das kann ich nur auf einem Computer machen, der mal abstürzen darf.

Ich fasse noch einmal zusammen, was passieren soll.

  • Beim Tippen von ‚e‘ soll 1-9,0 jeweils ein mal ausgegeben werden, dann nichts mehr.
  • Beim Tippen von ‚q‘ soll der Zähler zurück gesetzt werden, danach kommt beim Drücken von ‚e‘ wieder eine 1. Richtig?

Wenn Du’s nicht selbst schaffst, schreib noch mal, dann probiere ich das demnächst. Das geht dann aber nicht so schnell. :smile:

Gruß, Rainer

Hallo,

… mir ist da noch etwas durch den Kopf gegangen. Wenn es nur für ein Spiel sein soll, kann auch ‚Sendkeys‘ ausreichen. Das gesendete Zeichen kommt dann in der Anwendung an, die gerade aktiv ist.

Beispiel: Die Zeichen werden beim Drücken auf ‚Alt‘ gesendet … 1-0, danach nichts mehr. Neustart mit der rechten ‚Strg‘.

Ich habe Tasten genommen, die im Spiel vermutlich keine Funktion haben und die Ausgabe nicht beeinflussen.

Der Code:

Es wird auf der Form ein Timer benötigt.

'Auf der Form muß ein Timer 'Timer1' liegen

Option Explicit
Dim n As Integer
Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer

Private Sub Form\_Load()
 Timer1.Interval = 10
 Timer1.Enabled = True
End Sub

Private Sub Timer1\_Timer()
 Timer1.Enabled = False
 If GetAsyncKeyState(163) 0 Then
 n = 0
 End If
 If GetAsyncKeyState(164) 0 Then
 n = n + 1
 If n \> 10 Then n = 11
 If n 0
 Wend
 End If
 Timer1.Enabled = True
End Sub

… wobei ich mich frage, warum Du die Zahlen überhaupt einzeln tippen willst, Sendkeys kann auch Zeichenkette senden … :smile:

Gruß, Rainer

ja das sollen die funktionen sein:

  • Beim Tippen von ‚e‘ soll 1-9,0 jeweils ein mal ausgegeben werden, dann nichts mehr.
    -Nach 3 maliger wiederholung der 1 folgt die 2 und so weiter
  • Beim Tippen von ‚q‘ soll der Zähler zurück gesetzt werden, danach kommt beim Drücken von ‚e‘ wieder eine 1. Richtig?

Was luxus wäre ist ein start stop button, womit man das aktivieren kann und auch wieder deaktivieren

Ich finde das echt voll nett, das du dir da so eine Mühe mit machst.
Ich muss mich auch unbedingt mehr damit beschäftigen denn ich studiere Elektrotechnik und da werde ich auch bald anfangen zu programmieren

Oh was mir gerade noch einfällt:
manche befehle akzeptiert der bei mir nicht
zum beispiel das

 am anfang und am ende
und das "Private Declare Function GetAsyncKeyState Lib "user32" (ByVal
vKey As Long) As Integer"

das stellt der rot dar und akzeptiert das auch nicht deswegen habe ich auch zwischendurch erwähnt das ich mit VB6 arbeite, da ich dachte es handelt sich um einen Versionskonflikt.

MFG

Hallo,

Oh was mir gerade noch einfällt:
manche befehle akzeptiert der bei mir nicht
zum beispiel das

am anfang und am ende

*gg* die gehören ja auch zu w-w-w, nicht zum Code. Das sind die Tags, die die strukturierte Ansicht hier ermöglichen. Im VB mußt Du die natürlich weg lassen.

und das „Private Declare Function GetAsyncKeyState Lib
„user32“ (ByVal
vKey As Long) As Integer“

He! Das muß aber gehen! Wo hast Du das denn hin geschrieben? Das gehört in die Deklaration. Wenn Du den Code so nimmst, wie ich ihn gepostet habe, muß der aber funktionieren.

Welche Version von VB hast Du denn? Nicht daß es da Probleme mit der Standard-Edition gibt, was ich mir aber nicht vorstellen kann. Der API-Aufruf muß gehen!

das stellt der rot dar und akzeptiert das auch nicht deswegen
habe ich auch zwischendurch erwähnt das ich mit VB6 arbeite,
da ich dachte es handelt sich um einen Versionskonflikt.

Hmmm, ohne Getasynckeystate wird das aber nichts. Mach mal die pre-tags weg, und sieh es Dir noch mal an. Ob etwas ankommt kannst du mit dem Notepad testen.

Die drei Wiederholungen habe ich schon wieder nicht drin. :smile: Ich mach jetzt erst mal Werners Programm fertig und dann bau ich Deins noch mal um und maile es Dir.

Die Tasten e und q kann ich nicht verwenden, wenn ich es mit Sendkeys versuche, da kann ich nämlich das e und das q nicht unterdrücken. In Deinem Spiel würde dann folgendes ankommen…

e1e1e1e2e2e2e3e3e3e4e4qe1e1e1e2e2e2e3

und so weiter. Das ist nicht, was Du wolltest.

Gruß, Rainer

ja das würde reichen wenn da e1e1e1e2e2e2e3e3e3qe1e1e1 raus kommt denn die taste e und q ist nicht vergeben also ignoriert das spiel die

Hallo,

OK, dann nehm ich doch e und q. :smile:

Bis nachher.

Gruß, Rainer

Ich benutze die version
8176
und VBA Retail 6.0.8169
Forms3: 11.0.5601

Hallo,

Ich benutze die version
8176

ja, ich auch. Ich habe den Code mal hier aus dem Text geladen und den Fehler gesehen, da ist ein Zeilenumbruch, wo keiner sein darf. Ich maile Dir den Quellcode sicherheitshalber noch.

Aber Achtung beim Starten, ohne Programm, in dem die Zeichen ankommen siehst Du nichts, am Besten mal mit dem Notepad testen.

Gruß, Rainer

Option Explicit
Dim n As Integer
Dim c As Integer
Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer

Private Sub Form\_Load()
 Timer1.Interval = 10
 Timer1.Enabled = True
End Sub

Private Sub Timer1\_Timer()
 Timer1.Enabled = False
 If n = 0 Then n = 1
 If GetAsyncKeyState(81) 0 Then
 n = 1
 c = 0
 End If
 If GetAsyncKeyState(69) 0 Then
 If c \> 2 Then
 n = n + 1
 c = 0
 End If
 c = c + 1
 If n \> 10 Then n = 11
 If n 0
 Wend
 End If
 Timer1.Enabled = True
End Sub