Veröffentlicht 3. August 200421 j Wie stelle ich innerhalb meiner KeyboardProc fest ob Strg+Q gedrückt wurde?
4. August 200421 j Du könntest mit GetAsyncKeyState den Zustand der Strg-Taste prüfen, jedesmal, wenn im Hook ein Q ankommt. Alternativ kannst du den Zustand der Strg-Taste im Hook "verfolgen". Zusätzlich solltest du den Zustand der Umschalt- und Alt-Tasten berücksichtigen, falls du nicht auch bei Umschalt-Strg-Q usw. reagieren willst.
4. August 200421 j Autor So in der Art hab ichs versucht, also wenn in wParam ein Q drin steht und GetAsyncKeyState sagt das Strg gedrückt ist. Allerdings hat das nicht hingehauen weil die Keyboardproc so immer 2 mal aufgerufen wurde: Das Erste mal wenn ich Strg gedrückt habe und das Zweite mal bei Q.
4. August 200421 j Allerdings hat das nicht hingehauen weil die Keyboardproc so immer 2 mal aufgerufen wurde: Das Erste mal wenn ich Strg gedrückt habe und das Zweite mal bei Q. Das ist ja auch zu erwarten. Ich verstehe nicht, wo da das Problem liegt.
4. August 200421 j Autor Klar ist das zu erwarten:) Das Problem ist doch das es keinen Aufruf von Keyboardproc mit Strg+Q gibt, sondern nur mit Strg oder Q. Ich kann so also nur feststellen ob eine der beiden Tasten gedrückt wurde und nicht ob beide zusammen gedrückt wurden.
4. August 200421 j Aber du kannst doch, wie gesagt, mit GetAsyncKeyState testen, ob die Strg-Taste gerade gedrückt ist, wenn ein Q in deiner Keyboardproc aufschlägt.
4. August 200421 j Autor Hab ich, wie gesagt probiert, ging aber nicht. Vielleicht war aber auch einfach nur was falsch, aber ich denke das es so theoretisch gehen müsste: if (((DWORD)lParam & 0x40000000) &&(HC_ACTION==nCode)) { if (GetAsyncKeyState(VK_CONTROL) && wParam == 'q') { //... } } [/PHP]
4. August 200421 j 1. Der Virtual Key Code für die Q-Taste entspricht dem ASCII-Code des großen Q. 2. Der Rückgabewert von GetAsyncKeyState ist nicht einfach nur 0 oder != 0, sondern trägt zwei Informationen im MSB und LSB. Für den aktuellen Zustand ist das MSB entscheidend, also: if (((DWORD)lParam & 0x40000000) &&(HC_ACTION==nCode)) { if ((GetAsyncKeyState(VK_CONTROL) [b]& 0x8000[/b]) && wParam == '[b]Q[/B]') { //... } } [/CODE]
4. August 200421 j Autor So gehts, danke Aber kannst du mir die Bitverknüpfung mal erklären, das hab ich noch nie kapiert: GetAsyncKeyState(VK_CONTROL) & 0x8000 [/PHP]
4. August 200421 j Das ist doch das gleiche, was du mit dem LPARAM machst: Durch die Und-Verknüpfung werden alle Bits, die in der so genannten Maske (hier: 0x8000) nicht gesetzt sind, ausgeblendet. Nur die Bits, die in der Maske und im Vergleichswert gesetzt sind, kommen durch. GetAsyncKeyState gibt einen SHORT zurück, das ist ein 16-Bit-Wert. 0x8000 ist dual 1000 0000 0000 0000, also werden alle Bits bis auf das höchstwertige ausgeblendet. Im höchstwertigen Bit speichert GetAsyncKeyState den aktuellen Zustand der Taste. Alles klar?
4. August 200421 j Autor Das ist doch das gleiche, was du mit dem LPARAM machst: Das ist nur kopiert :floet: Durch die Und-Verknüpfung werden alle Bits, die in der so genannten Maske (hier: 0x8000) nicht gesetzt sind, ausgeblendet. Nur die Bits, die in der Maske und im Vergleichswert gesetzt sind, kommen durch. GetAsyncKeyState gibt einen SHORT zurück, das ist ein 16-Bit-Wert. 0x8000 ist dual 1000 0000 0000 0000, also werden alle Bits bis auf das höchstwertige ausgeblendet. Im höchstwertigen Bit speichert GetAsyncKeyState den aktuellen Zustand der Taste. Alles klar? So langsam ergibt alles Sinn Danke:)
Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.