Direkt Input -Joystick Button binden
-
Hi leute,
habe nun folgendes:
// When a button is pressed for( int i = 0; i < 128; i++ ) { if (js.rgbButtons[i] & 0x80) { TCHAR sz[128]; StringCchPrintf( sz, 128, TEXT("%02d "),i); StringCchCat(strText,512, sz ); if(String(strText).AnsiPos(joystickbutton) == 1) keybd_event('K',0x25, 0, 0); } }
Wie kann man denn am geschicktesten das KeyUP Event auslösen damit die Taste auf der Tastatur wieder freigegeben wird ? Das freigeben soll natürlich erst dann erfolgen wenn ich die Joystick Taste wieder los lasse.
Ich will bezwecken das in einem Kommunikationsprogramm "push to talk" auf einen Joystickbutton gebunden wird was auch tadellos funktioniert, nur das er momentan mit dem obigen Code ständig die aktivierung der Sprachfunktion hält
Frage: Wie release ich die Keyboard Taste gescheit so das der virtuelle Keypress so lange dauert wie ich auf den Joystickbutton drücke ? Denke jetzt schon seit 2 Tagen nach und komme auf nichts gescheits.
Vielen Dank schon mal !
David
-
Mein erster funktionierender Lösungsansatz:
bool istrue = false; // When a button is pressed for( int i = 0; i < 128; i++ ) { if (js.rgbButtons[i] & 0x80) { TCHAR sz[128]; StringCchPrintf( sz, 128, TEXT("%02d "),i); StringCchCat(strText,512, sz ); if(String(strText).AnsiPos(joystickbutton) == 1) { keybd_event('K',0x25, 0, 0); istrue = true; } } } if(istrue == false) keybd_event('K',0x25,KEYEVENTF_KEYUP, 0);
Was haltet ihr davon, da diese Funktion in einer Schleife hängt wird das Key_UP event stetig ausgelöst was mich deftig stört. Wie könnte man die Sache elegant machen ? Bin auch für den kleinsten Tip sehr Dankbar !
-
In MSDN steht zu keybd_event folgendes
dwFlags
[in] Specifies various aspects of function operation. This parameter can be one or more of the following values.
[...]
KEYEVENTF_KEYUP
If specified, the key is being released. If not specified, the key is being depressed.Vielleicht hilft dir das ja weiter.
-
ich benutze doch schon KeyUP, was meinst du genau ?
Was bedeutet das dwFlags [in], steht das mit deiner Begründung in Verbindung ? Stehe etwas auf dem Schlauch
-
IIRC ist keybd_event veraltet. Es sollte SendInput verwendet werden.
Im übrigen musst du einfach nur bei Drücken der Joystick-Tasten ein Keydown, und bem loslassen ein Keyup senden.
Bye, TGGC (Der Held lebt!)
-
Zero01 schrieb:
ich benutze doch schon KeyUP, was meinst du genau ?
Sry, hab ganz übersehen, dass du in deinem 2. Beitrag schon KEYEVENTF_KEYUP benutzt. Scheint mir allerdings noch nicht richtig zu sein. Du hast doch bestimmt das Ereignis, wenn ein Joystick Button losgelassen wird? Genau dann, sendest du einfach ein keyup. Hab gerade mal in MSDN nachgeschaut. keybd_event ist tatsächlich veraltet. Du solltest also SendInput verwenden. Wird ab Win98 und WinNT 4 SP 3 unterstützt.
-
Bei SendInput hab ich bedenken das wenn es n einer Schleife mitläuft das er ständig bei einem gedrückten Joybutton im intervall drückt anstatt KeyUp und KeyDown explizit zu definieren. Ich möchte ja gerne push to talk auf dem Joybutton haben und da darf nicht der Button nur in einem Intervall gedrückt werden weil sonst alles Ab- ge -ha -ck -t ankommt. Mein letztes Update oben arbeitet vorzüglich, aber leider nicht sauber da KeyUP stetig in der schleife ausgelöst wird. Ich müsste herausfinden wie das KeyUP event jeweils nur einmal nach einem Joybutton klick (siehe programmstruktur) ausgelöst wird. könnte mir da ein zusätzlicher boolean helfen ?
@ groovemaster: Leider weiß ich nicht was beim loslassen des Joybuttons geschieht. Wenn ich das wüßte würde ich hier Luftsprünge machen weil dann alles perfekt wäre
Spitze, ich hab gerade gesehen das man bei SendInput ein return value hat um zu reagieren und mit AsynckeyState kann man abfragen ob die Taste ohnehin schon gedrückt ist, cooles dingen des SendInput, aber hoffentlich bekomme ich das oben genannte problem gebacken
-
Zero01 schrieb:
Bei SendInput hab ich bedenken das wenn es n einer Schleife mitläuft das er ständig bei einem gedrückten Joybutton im intervall drückt anstatt KeyUp und KeyDown explizit zu definieren.
Was hat das miteinander zu tun?
Wenn der Joy Button losgelassen wird, wird einfach ein Bit gelöscht. Warum du das ein einem String hast, weisst du wahrscheinlich selbst nicht.
Bye, TGGC (Der Held lebt!)
-
Es funktioniert, vielen Dank !