Ich arbeite an einem Projekt, bei dem ich einen Super Nintendo Controller nahm und ihn mit einem Arduino steuerte. Der Arduino liest die Taste drückt auf den Controller und sendet es über eine serielle Verbindung.Simulationsschlüssel wird in C und WINAPI gehalten
Ich arbeite an einem Empfängerprogramm, das von der seriellen Schnittstelle liest und dann Tastenbetätigungen in Windows simuliert, damit ich den Controller in anderen Programmen verwenden kann.
Die Sache ist, ich habe so ziemlich alles runter. Außer es gibt ein Problem. Meine simulierten Tasten drücken nicht wirklich gedrückt. Hier
ist der Code für die A-Taste (Tasten sind aktiv niedrig, so dass sie ‚falsch‘, wenn sie gedrückt wird)
if(!(buttonState.state_word & B_A))
{
/* If previous state is not pressed, and current is pressed, simulate a keypress */
if(prevState.state_word & B_A)
keybd_event(0x41, 0x41,KEYEVENTF_EXTENDEDKEY | 0,0);
}
else if(buttonState.state_word & B_A)
{
/* If previous state is pressed, and current is not pressed, simulate a key release */
if(!(prevState.state_word & B_A))
keybd_event(0x41, 0x41,KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,0);
}
Wenn ich A auf dem SNES Controller drücken, ein A im Notizblock erscheint , beispielsweise. Und wenn ich die A-Taste auf der SNES-Controller halten, wird ein einzelnes A im Editor angezeigt, aber das Terminal wird drucken, dass der Schlüssel gehalten wird, wie ich es programmiert habe.
Wenn die Taste zum ersten Mal gedrückt wird, wird der Tastendruck simuliert. Wenn es gedrückt wird, werden keine Anrufe mehr getätigt, um einen Tastendruck zu simulieren. Und dann, wenn die SNES-Taste losgelassen wird, wird der Tastendruck ebenfalls freigegeben.
Da es diese Zeit zwischen dem Keydown und dem Keyup gibt, warum wird nur ein einzelner Buchstabe gedruckt, und nicht so, als ob die Tastatur gedrückt und wiederholt gedruckt wird?
Wann wird 'prevState' aktualisiert? –
Es klingt, als ob die Tasten "typatisch" sein sollen. Ich weiß nicht, ob das mit simulierten Tastaturereignissen in Windows funktioniert. –
müssen Sie den Status der Schaltflächen überhaupt nicht beibehalten. Wenn Sie ein fernes Ereignis (Keydown oder Keyup) haben, brauchen Sie den direkten Aufruf 'keybd_event' ohne irgendwelche Prüfungen und Bedingungen. – RbMm