Maustaste gedrückt halten - gelöst (auf viele Arten ;)
Äh, danke, aber ich wollte doch gar keinen callback, ein einfacher GetAsyncKesState reicht für mein Problem völlig. Deshalb hab ich´s doch auch ins Anfängerforum gepostet, ich hab mir gedacht, das es da mal wieder einen Befehl gibt, der mit gerade nicht einfällt und der zu simpel ist, als das man ihn durch suchen nach seiner funktion findet.
Naja, imerhin weiß ich jetzt auch, wie man in PB einen callback für childfenster (also die gadgets) nachträglich einfügt....
Trotzdem kommt mir der code ein klitzekleinesbisschen umständlich vor...
Naja, imerhin weiß ich jetzt auch, wie man in PB einen callback für childfenster (also die gadgets) nachträglich einfügt....
Trotzdem kommt mir der code ein klitzekleinesbisschen umständlich vor...
Johann Wolfgang von Geothe hat geschrieben:Wie dieses oder jenes Wort geschrieben wird, darauf kommt es doch eigentlich nicht an, sondern darauf, daß die Leser verstehen, was man damit sagen wollte.
Ich habe gerade ein ähnliches Problem.
Ich habe bisher mit Callback und Message gearbeitet, habe aber ab und zu ein Fehlermeldung aus dieser Callback, die sich keiner Aktion eindeutig zuordnen läßt.
Daher will ich es jetzt mit GetKeystate und GetAsynckeystate versuchen. Die Abfrage muss über ein Fenster funktionieren, nicht über Gadgets, weshalb die Eventtypes leider nicht gehen.
MSDN
Johannes Rosenberg
PS brauch das für ein Bugfix update von GeoControl (http://www.cajomi.de/GeoControl/geocontrol.htm)
Ich habe bisher mit Callback und Message gearbeitet, habe aber ab und zu ein Fehlermeldung aus dieser Callback, die sich keiner Aktion eindeutig zuordnen läßt.
Daher will ich es jetzt mit GetKeystate und GetAsynckeystate versuchen. Die Abfrage muss über ein Fenster funktionieren, nicht über Gadgets, weshalb die Eventtypes leider nicht gehen.
MSDN
Wie komme ich an die signifikanten bits? Von binär operationen verstehe ich leider so gar nichts.If the function succeeds, the return value specifies whether the key was pressed since the last call to GetAsyncKeyState, and whether the key is currently up or down. If the most significant bit is set, the key is down, and if the least significant bit is set, the key was pressed after the previous call to GetAsyncKeyState. However, you should not rely on this last behavior; for more information, see the Remarks.
Johannes Rosenberg
PS brauch das für ein Bugfix update von GeoControl (http://www.cajomi.de/GeoControl/geocontrol.htm)
Aber Achtung, GetAsyncKeyState_() gibt den Status der physischen linken Taste. Wenn der Benutzer also die Buttons geswapt hat, weil er Linkshänder ist, geht das schief.
Sven
Code: Alles auswählen
Procedure.l GetMouseLeftState() ;aktueller Status linke Mousetaste
If GetSystemMetrics_(#SM_SWAPBUTTON) ;wenn Tasten getauscht
ProcedureReturn GetAsyncKeyState_(#VK_RBUTTON) ;Status rechte physische Taste
Else
ProcedureReturn GetAsyncKeyState_(#VK_LBUTTON) ;Status linke physische Taste
EndIf
EndProcedure
- ts-soft
- Beiträge: 22292
- Registriert: 08.09.2004 00:57
- Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel - Wohnort: Berlin
wurde zwar schon gesagt, aber hier nochmal aus dem engl. Forum:

Richtig übersetzen sollte dann jemand anders machendagcrack hat geschrieben:Never use getasynckeystate_(#VK_LBUTTON)
Instead, you must catch the messages #WM_LBUTTONDOWN and #WM_LBUTTONUP !.
You CAN catch those without using a callback, but you should use one already for secure messaging.
And if you really want to use GetAsyncKeyState(); Then you'll need to do a test to see if your window has focus first, because it will fire/trigger whenever you click your LMB anywhere at your system.
This is an overhead of 2 api calls vs catching a message. It's your call though, I'd go with the callback for some comfy messaging. But you could always call GetKeyState()...

PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

hab ich ein Loch in der Zunge oder was?
Die Frage habe ich doch ganz klar formuliert.
@ts-soft
weißt Du also, wie man die bits ausliest, oder willst Du hier einen auf schlau machen.
Vieleicht schreib ich in Kürze ja mal nen Thread über die Probleme mit Api Callbacks. Aber das sollte ich mir überlegen: Vielleicht kommt dann da irgendeinanderer, und erklärt dem nächsten, der die benutzen möchte: Bloß nie Api Callbacks. Ob und wie etwas funktioniert hängt doch stark von der Umgebung ab. Solche pauschalen "Never" sind was für snips Programmierer, aber nicht für volle Anwendungen.
Die Frage habe ich doch ganz klar formuliert.
@ts-soft
weißt Du also, wie man die bits ausliest, oder willst Du hier einen auf schlau machen.
Vieleicht schreib ich in Kürze ja mal nen Thread über die Probleme mit Api Callbacks. Aber das sollte ich mir überlegen: Vielleicht kommt dann da irgendeinanderer, und erklärt dem nächsten, der die benutzen möchte: Bloß nie Api Callbacks. Ob und wie etwas funktioniert hängt doch stark von der Umgebung ab. Solche pauschalen "Never" sind was für snips Programmierer, aber nicht für volle Anwendungen.
- ts-soft
- Beiträge: 22292
- Registriert: 08.09.2004 00:57
- Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel - Wohnort: Berlin
Ich hab ja auch nicht auf Deine Frage geantwortet, oder hab ich Dich zitiert?JoRo hat geschrieben:hab ich ein Loch in der Zunge oder was?
Die Frage habe ich doch ganz klar formuliert.
Ich habe eine allgemeine Information zu diesem Thema gepostet. Ansonsten
zu Deiner frage:
Code: Alles auswählen
Procedure.l GetMouseLeftState() ;aktueller Status linke Mousetaste
If GetSystemMetrics_(#SM_SWAPBUTTON) ;wenn Tasten getauscht
ProcedureReturn GetAsyncKeyState_(#VK_RBUTTON) & $8000 ;Status rechte physische Taste
Else
ProcedureReturn GetAsyncKeyState_(#VK_LBUTTON) & $8000;Status linke physische Taste
EndIf
EndProcedure

Wenn jemand etwas falsch interpretiert, so ist das keine Berechtigung so
zu Antworten. Man kann hier nicht alles so Ausdrücken, das es jeder richtig
interpretiert!
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

stimmt, der Thread ist von jemand anders, der übrigens genau diese Frage auch gestellt hatte, schien mir jedenfalls so (Zitat aus MSDN), aber diese Frage nicht beantwortet bekam.
Danke also für die Antwort.
Zu der habe ich noch eins zwei Fragen:
Das "&" ist bitweises "and", $8000 ist hexadezimal und ist binär
1000 0000 0000 0000.
Die Addition des GetAsynckeystate ergibt null, wenn das erste bit nicht 1 ist. Das wäre also die Lösung für das "signifikante" bit.
Das letzte signifikante bit gäbe dann 1, wenn ich es mit 1 addiere?
also
Gilt genau das gleiche Verfahren auch für GetKeystate, also
Dort heißt es HiOrder und LowOrder bit. Sind die also das gleiche wie "most" and "least significant"?
Johannes Rosenberg
PS Ich habe so genervt reagiert, weil man diese Art Antworten hier ständig bekommt. Das ist so als wenn ich jemanden Frage: Wo bitte geht es zum Hauptbahnhof" und er fragt mich als erstes, warum ich den die Eisenbahn nehme, mit dem Auto kommt man doch viel besser voran.
Schöner wäre es, erst die Frage zu beantworten und dann die Hinweise auf die möglichen Probleme zu geben.
Danke also für die Antwort.
Zu der habe ich noch eins zwei Fragen:
Code: Alles auswählen
GetAsyncKeyState_(#VK_RBUTTON) & $8000
1000 0000 0000 0000.
Die Addition des GetAsynckeystate ergibt null, wenn das erste bit nicht 1 ist. Das wäre also die Lösung für das "signifikante" bit.
Das letzte signifikante bit gäbe dann 1, wenn ich es mit 1 addiere?
also
Code: Alles auswählen
GetAsyncKeyState_(#VK_RBUTTON) & %1
Code: Alles auswählen
GetKeyState_(#VK_RBUTTON) & $8000
Johannes Rosenberg
PS Ich habe so genervt reagiert, weil man diese Art Antworten hier ständig bekommt. Das ist so als wenn ich jemanden Frage: Wo bitte geht es zum Hauptbahnhof" und er fragt mich als erstes, warum ich den die Eisenbahn nehme, mit dem Auto kommt man doch viel besser voran.
Schöner wäre es, erst die Frage zu beantworten und dann die Hinweise auf die möglichen Probleme zu geben.
- ts-soft
- Beiträge: 22292
- Registriert: 08.09.2004 00:57
- Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel - Wohnort: Berlin
Ich denke mal es ist dasselbe, wurde nur anders bezeichnet.
//Nachtrag:
Hier mal eine kleine Proc zum Testen, ob ein Bit gesetzt wurde:
//Nachtrag:
Hier mal eine kleine Proc zum Testen, ob ein Bit gesetzt wurde:
Code: Alles auswählen
Procedure TestBit(Value.l, BitNumber.l)
If Value & (1 << BitNumber)
ProcedureReturn #True
Else
ProcedureReturn #False
EndIf
EndProcedure
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
