EventwParam() und EventlParam()
EventwParam() und EventlParam()
Hallo an alle
PB unterstützt ja die Aktivierung einer Windows Callback zus. zur PB eigenen Event Message Loop.
SetWindowCallback(@WinCallback()) ; Callback aktivieren
...
Procedure WinCallback(hWnd, uMsg, wParam, lParam) ; Windows füllt die Parameter automatisch, welche wir im Callback verwenden...
ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
Einerseits ist diese Flexibilität, die Standard Funktionen von PB auch für Profis erweitern zu können, recht gut andererseits benötige ich die Windows Callback recht häufig weil viele Meldungen aus Windows eben nicht mittels PureBasic abgefangen und bearbeitet werden können. Und somit muss ich ständig 2 Message Loops haben und verwalten und habe nun mehr Aufwand als in der klassischen Win Programmierung.
Dann habe ich die beiden undokumentierten Funktionen EventwParam() und EventlParam() gefunden und dachte mir, daß man damit ja schon weitere Windows Funktionen auswerten kann ohne ein extra Windows Callback einrichten zu müssen. Aber Fehlanzeige. Aus irgendeinem Grund sind die Inhalte die von EventlParam() und EventwParam() zurückgegeben werden nicht identisch mit wParam und lParam aus der Windows Message Loop. Mache ich was falsch ? Nutzt jemand die beiden Funktionen EventwParam() und EventlParam() ? und kann mir Beispiele dazu geben wie und wo man diese nutzen kann ?
Danke
PB unterstützt ja die Aktivierung einer Windows Callback zus. zur PB eigenen Event Message Loop.
SetWindowCallback(@WinCallback()) ; Callback aktivieren
...
Procedure WinCallback(hWnd, uMsg, wParam, lParam) ; Windows füllt die Parameter automatisch, welche wir im Callback verwenden...
ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
Einerseits ist diese Flexibilität, die Standard Funktionen von PB auch für Profis erweitern zu können, recht gut andererseits benötige ich die Windows Callback recht häufig weil viele Meldungen aus Windows eben nicht mittels PureBasic abgefangen und bearbeitet werden können. Und somit muss ich ständig 2 Message Loops haben und verwalten und habe nun mehr Aufwand als in der klassischen Win Programmierung.
Dann habe ich die beiden undokumentierten Funktionen EventwParam() und EventlParam() gefunden und dachte mir, daß man damit ja schon weitere Windows Funktionen auswerten kann ohne ein extra Windows Callback einrichten zu müssen. Aber Fehlanzeige. Aus irgendeinem Grund sind die Inhalte die von EventlParam() und EventwParam() zurückgegeben werden nicht identisch mit wParam und lParam aus der Windows Message Loop. Mache ich was falsch ? Nutzt jemand die beiden Funktionen EventwParam() und EventlParam() ? und kann mir Beispiele dazu geben wie und wo man diese nutzen kann ?
Danke
Re: EventwParam() und EventlParam()
Du machst nichts falsch.
WindowEvent() und das uMsg in einem Callback geben beide nicht das selber aus.
Einige Events hat nur WindowEvent(), andere nur das uMsg.
Voralem beim verschieben eines Fensters, friert das WindowEvent() komplett ein, wodurch man nur mit einem Callback infos beim verschieben ermitteln kann.
Du kannst also leider nicht das Callback umgehen und auf EventwParam() und EventlParam().
Trotzdem sind beide Funktionne durch aus wichtig um Ereignisse abzufangen.
WindowEvent() und das uMsg in einem Callback geben beide nicht das selber aus.
Einige Events hat nur WindowEvent(), andere nur das uMsg.
Voralem beim verschieben eines Fensters, friert das WindowEvent() komplett ein, wodurch man nur mit einem Callback infos beim verschieben ermitteln kann.
Du kannst also leider nicht das Callback umgehen und auf EventwParam() und EventlParam().
Trotzdem sind beide Funktionne durch aus wichtig um Ereignisse abzufangen.
Code: Alles auswählen
Procedure WinCallback(hWnd, uMsg, wParam, lParam)
Debug Str(uMsg)+" : "+Str(wParam)+" , "+Str(lParam)
ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
OpenWindow(0, 0, 0, 200, 100, "Messages", #PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget)
SetWindowCallback(@WinCallback())
Repeat
Event = WaitWindowEvent()
Debug "-> "+Str(Event)+" : "+Str(EventwParam())+" , "+Str(EventlParam())
Select Event
Case #PB_Event_CloseWindow
End
EndSelect
ForEver
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Re: EventwParam() und EventlParam()
Danke Stargate für die schon mal hilfreiche Bestätigung.
Hast du ein Beispiel wofür man dann EventwParam und EventlParam einsetzen kann ? Es ist ja auch undokumentiert, hat es dann überhaupt eine Bedeutung ?
Ich finds halt schade, daß man nicht die Werte der WindowsCallback irgendwie mit einem Extrasatz an #PB_ Konstanten/Variablen z.B. #PB_hWnd, #PB_uMsg usw. in die PB Message Loop bekommen kann. Denn dadurch könnte man sich die Windows Callback immer sparen. Zumindest habe ich den Vorschlag per email mal an Fred geschickt.
Hast du ein Beispiel wofür man dann EventwParam und EventlParam einsetzen kann ? Es ist ja auch undokumentiert, hat es dann überhaupt eine Bedeutung ?
Ich finds halt schade, daß man nicht die Werte der WindowsCallback irgendwie mit einem Extrasatz an #PB_ Konstanten/Variablen z.B. #PB_hWnd, #PB_uMsg usw. in die PB Message Loop bekommen kann. Denn dadurch könnte man sich die Windows Callback immer sparen. Zumindest habe ich den Vorschlag per email mal an Fred geschickt.
Re: EventwParam() und EventlParam()
eventwparam usw. kannst du nur bei einer windows message auswerten. um ein callback wirst du aber im ernstfall gar nicht herum kommen, da die message im pb eventloop schon wieder vorbei ist, bevor sie dort ankommt.
Re: EventwParam() und EventlParam()
Hier ein Beispiel von mir:
"eigener" Text-Editor - ImageGadget geeignet ? Ja (Demo)
CodeAusschnitt:
Dort werte ich einen Tastendrück den WindowEvent() liefert mit EventwParam() aus,
in in diesem fall gibt mit Chr(EventwParam()) dann genau das Zeichen was gedrück wurde, sowohl mit beachtung der Großklein Schreibung, als auch direkte Asciis mit dem Nummerpad, und auch é è usw.
das ist recht hilfreich.
"eigener" Text-Editor - ImageGadget geeignet ? Ja (Demo)
CodeAusschnitt:
Code: Alles auswählen
Event = WaitWindowEvent()
Select Event
Case 258 ; Tastendruck (Zeicheneingabe)
Select EventwParam()
Case 8 ; Löschen nach links
If Position > 0 : Position - 1 : EndIf
Text$ = Left(Text$, Position) + Mid(Text$, Position+2)
Default ; Ein Zeichen
Text$ = Left(Text$, Position) + Chr(EventwParam()) + Mid(Text$, Position+1)
Position + 1
EndSelect
in in diesem fall gibt mit Chr(EventwParam()) dann genau das Zeichen was gedrück wurde, sowohl mit beachtung der Großklein Schreibung, als auch direkte Asciis mit dem Nummerpad, und auch é è usw.
das ist recht hilfreich.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Re: EventwParam() und EventlParam()
Hi Stargate
danke für das Beispiel. Du wertest die WM_CHAR (258 H102) aus und bekommst den wParam mit EventwParam() geliefert.
Aber warum klappt das bei meiner Anwendung nicht. Dort will ich die Windows Meldung
EventID = WaitWindowEvent()
If EventID = #WM_POWERBROADCAST
If EventwParam()=4
MessageBeep_(0)
Endif
Endif
abfangen. Leider liefert dort die Funktion EventwParam() nicht die richtigen Werte. Erst wenn ich das gleiche mittels der Callback mache funktioniert es.
Procedure WinCallback(hWnd, uMsg, wParam, lParam) ; Windows füllt die Parameter automatisch, welche wir im Callback verwenden...
If uMsg = #WM_POWERBROADCAST
If wParam=4
MessageBeep_(0)
EndIf
EndIf
ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
Schade das PB es einmal zulässt und ein anderes mal nicht ohne das man einen Grund erkennt.
danke für das Beispiel. Du wertest die WM_CHAR (258 H102) aus und bekommst den wParam mit EventwParam() geliefert.
Aber warum klappt das bei meiner Anwendung nicht. Dort will ich die Windows Meldung
EventID = WaitWindowEvent()
If EventID = #WM_POWERBROADCAST
If EventwParam()=4
MessageBeep_(0)
Endif
Endif
abfangen. Leider liefert dort die Funktion EventwParam() nicht die richtigen Werte. Erst wenn ich das gleiche mittels der Callback mache funktioniert es.
Procedure WinCallback(hWnd, uMsg, wParam, lParam) ; Windows füllt die Parameter automatisch, welche wir im Callback verwenden...
If uMsg = #WM_POWERBROADCAST
If wParam=4
MessageBeep_(0)
EndIf
EndIf
ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
Schade das PB es einmal zulässt und ein anderes mal nicht ohne das man einen Grund erkennt.
- 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
Re: EventwParam() und EventlParam()
Wenn Du API verwendest, solltest Du auch ein Callback nutzen, der normale EventLoop ist dafür nichtKPA hat geschrieben:Schade das PB es einmal zulässt und ein anderes mal nicht ohne das man einen Grund erkennt.
geeignet, es kommen dort nicht alle Events an. EventWParam und EventLParam sind nicht ohne Grund
undokumentiert. Wenn es trotzdem klappt, ist es glück und kann in der nächsten PB Version schon nicht
mehr funktionieren.
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.

Re: EventwParam() und EventlParam()
KPA, kleine Tipp an dich: Nutze doch bitte in Zukunft die Code-Tags - Das fördert die Leserlichkeit!
"Menschenskinder, das Niveau dieses Forums singt schon wieder!" — GronkhLP ||| "ich hogffe ihr könnt den fehle endecken" — Marvin133 ||| "Ideoten gibts ..." — computerfreak ||| "Jup, danke. Gruss" — funkheld
Re: EventwParam() und EventlParam()
@KPA,
Purebasic ist für mehrere Betriebssysteme entwickelt worden (Win, Linux, Mac).
Um möglichst ein gleiches Verhalten zu erreichen ist natürlich das Ergebnis von WaitWindowEvent()
für alle OS gleich abgestimmt.
Daher gibt es das SetWindowsCallback auch nur für Windows um auf weitere Events reagieren zu können.
FF
Purebasic ist für mehrere Betriebssysteme entwickelt worden (Win, Linux, Mac).
Um möglichst ein gleiches Verhalten zu erreichen ist natürlich das Ergebnis von WaitWindowEvent()
für alle OS gleich abgestimmt.
Daher gibt es das SetWindowsCallback auch nur für Windows um auf weitere Events reagieren zu können.
FF

Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive