Maustaste gedrückt halten - gelöst (auf viele Arten ;)

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
benpicco
Beiträge: 391
Registriert: 01.10.2004 15:32
Wohnort: im Code
Kontaktdaten:

Beitrag von benpicco »

Ä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...
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.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

GetAsyncKeyState ist Global , daher habe ich auf das abfangen von #WM_LBUTTONDOWN hingewiesen ...

Und Subclassing ist eine saubere , und vor allem alles andere als
eine umstaendliche Loesung.
JoRo
Beiträge: 61
Registriert: 25.09.2004 17:45

Beitrag von JoRo »

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
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.
Wie komme ich an die signifikanten bits? Von binär operationen verstehe ich leider so gar nichts.

Johannes Rosenberg

PS brauch das für ein Bugfix update von GeoControl (http://www.cajomi.de/GeoControl/geocontrol.htm)
Sven
Beiträge: 374
Registriert: 23.09.2004 12:01

Beitrag von Sven »

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.

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
Sven
JoRo
Beiträge: 61
Registriert: 25.09.2004 17:45

Beitrag von JoRo »

Danke, aber das wußte ich schon.
Wie bekomme ich die signifikanten bits:
nach MSDN wird unterschieden nach dem most und last significant bit,
bzw. bei GetKeystate nach HiOrder Bit und LowOrder Bit.
HiWord und LoWord kenn ich, aber HiOrder bit und LowOrder bit nicht.
Benutzeravatar
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

Beitrag von ts-soft »

wurde zwar schon gesagt, aber hier nochmal aus dem engl. Forum:
dagcrack 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()...
Richtig übersetzen sollte dann jemand anders machen :oops:
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.
Bild
JoRo
Beiträge: 61
Registriert: 25.09.2004 17:45

Beitrag von JoRo »

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.
Benutzeravatar
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

Beitrag von ts-soft »

JoRo hat geschrieben:hab ich ein Loch in der Zunge oder was?
Die Frage habe ich doch ganz klar formuliert.
Ich hab ja auch nicht auf Deine Frage geantwortet, oder hab ich Dich zitiert?
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
Obwohl dieser Thead ja von jemand anderen ist :wink:
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.
Bild
JoRo
Beiträge: 61
Registriert: 25.09.2004 17:45

Beitrag von JoRo »

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:

Code: Alles auswählen

GetAsyncKeyState_(#VK_RBUTTON) & $8000
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

Code: Alles auswählen

GetAsyncKeyState_(#VK_RBUTTON) & %1
Gilt genau das gleiche Verfahren auch für GetKeystate, also

Code: Alles auswählen

GetKeyState_(#VK_RBUTTON) & $8000
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.
Benutzeravatar
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

Beitrag von ts-soft »

Ich denke mal es ist dasselbe, wurde nur anders bezeichnet.

//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.
Bild
Antworten