Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Seltsames Verhalten von GetAsyncKeyState? (https://www.delphipraxis.net/194141-seltsames-verhalten-von-getasynckeystate.html)

Glados 21. Okt 2017 15:50


Seltsames Verhalten von GetAsyncKeyState?
 
Edit: Problem wurde gelöst. Ich lasse Get(Async)KeyState einfach weg.

Ich habe ein ListView. sagen wir mal halb gefüllt und mit Report-Ansicht.
Wenn ich im leeren Bereich des LlistViews das mit dem ListView verbundene Popupmenu per Rechtsklick anzeigen lasse und dann mit der linken Maustaste auf ein ListView-Item klicke, wird folgendes nur jedes zweite Mal ausgeführt:
Delphi-Quellcode:
if (GetAsnyKeyState(VK_RBUTTON) = 0) and (GetAsnyKeyState(VK_APPS) = 0) then
 showmessage('X'); // hier werden meine ToolButtons enabled/disabled
Wenn ein Item selektiert ist, schalte ich ToolButtons in meiner Toolbar auf Enabled True. Ist keins selektiert false.
Wenn ich oben genannte Schritte jetzt befolge (PopupMenu anzeigen, dann linksklick auf ein Item), bleiben meine Items auf Enabled false.

In einem anderen Forum lese ich
Zitat:

Probier mal "GetAsyncKeyState", wichtig !! am Anfang Deiner Funktion sollte einmal "GetAsyncKeyState" aufgerufen werden, da diese Funktion in Abhängigkeit vom nächsten/vorherigen Aufruf der Funktion reagiert.
Was hat es denn damit auf sich?

Ich habe es mal getestet und es funktioniert glaube ich. Aber alles doppelt aufrufen? Wieso?
Delphi-Quellcode:
GetAsyncKeyState(VK_RBUTTON);
GetAsyncKeyState(VK_APPS);

if (GetAsyncKeyState(VK_RBUTTON) = 0) and (GetAsyncKeyState(VK_APPS) = 0) then
 showmessage('X'); // hier werden meine ToolButtons enabled/disabled
Führe ich dieses doppelte GetAsyncKeyState aus, bekomme ich meine Items so wie ich sie brauche.

himitsu 23. Okt 2017 10:57

AW: Seltsames Verhalten von GetAsyncKeyState?
 
GetAsyncKeyState hat zwei Werte (Bits) in seinem Result, der "doppelte" Aufruf sollte sich hier (2) eigentlich garnicht auswirken, im Gegensatz zu (1), aber da wäre dein Vorgehen eher tödlich.

Test: Drücke die Tasten so lange, bis du diesen Dialog siehts.
[EDIT] Lies die Dokumentation und bedenke deine falsche Auswertung (4) -> MSDN-Library durchsuchenGetAsyncKeyState.

Delphi-Quellcode:
1: Ord(GetAsyncKeyState(...)) <> 0  // LSB: Taste wurde zwischen jetzt und dem letzten Aufruf von GetAsyncKeyState gedrückt.
2: GetAsyncKeyState(...) < 0   // MSB: Taste ist "jetzt" gedrückt, während des Aufrufs !!!
3: GetKeyState(...) // Taste wurde gedrückt, als Windows mit der aktuellen Aktion anfing (als die aktuell verarbeitete Message "gesendet" wurde)

4: GetAsyncKeyState(...) = 0 oder GetAsyncKeyState(...) <> 0  // MSB *und* LSB auswerten, das kann nur schief gehen, darum hilft hier der "tödlich" doppelte Aufruf
Ich empfehle dir auch den Unterschied zwischen GetAsyncKeyState und GetKeyState zu lernen und dann Letzeres zu verwenden.
http://blog.m-ri.de/index.php/2008/0...-zu-verwenden/

Glados 23. Okt 2017 11:05

AW: Seltsames Verhalten von GetAsyncKeyState?
 
Zitat:

Edit: Problem wurde gelöst. Ich lasse Get(Async)KeyState einfach weg.
;) .

himitsu 23. Okt 2017 11:29

AW: Seltsames Verhalten von GetAsyncKeyState?
 
Das Edit war garnicht aufgefallen. :oops:

Aber zumindestens weißt du nun warum es nicht ging.
Delphi-Quellcode:
... = 0
:zwinker:
GetKeyState kennt nur "jetzt" und kein gleichzeitiges "zuletzt".


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:06 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz