Seite 1 von 1
EventwParam() und EventlParam()
Verfasst: 18.06.2010 07:18
von KPA
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
Re: EventwParam() und EventlParam()
Verfasst: 18.06.2010 07:59
von STARGÅTE
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.
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
Re: EventwParam() und EventlParam()
Verfasst: 18.06.2010 08:33
von KPA
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.
Re: EventwParam() und EventlParam()
Verfasst: 18.06.2010 10:15
von edel
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()
Verfasst: 18.06.2010 11:56
von STARGÅTE
Hier ein Beispiel von mir:
"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
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.
Re: EventwParam() und EventlParam()
Verfasst: 18.06.2010 12:19
von KPA
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.
Re: EventwParam() und EventlParam()
Verfasst: 18.06.2010 12:29
von ts-soft
KPA hat geschrieben:Schade das PB es einmal zulässt und ein anderes mal nicht ohne das man einen Grund erkennt.
Wenn Du API verwendest, solltest Du auch ein Callback nutzen, der normale EventLoop ist dafür nicht
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.
Re: EventwParam() und EventlParam()
Verfasst: 18.06.2010 15:57
von c4s
KPA, kleine Tipp an dich: Nutze doch bitte in Zukunft die Code-Tags - Das fördert die Leserlichkeit!
Re: EventwParam() und EventlParam()
Verfasst: 18.06.2010 23:03
von mk-soft
@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
