EventwParam() und EventlParam()

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
KPA
Beiträge: 35
Registriert: 10.06.2010 22:53

EventwParam() und EventlParam()

Beitrag 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
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: EventwParam() und EventlParam()

Beitrag 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 
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
KPA
Beiträge: 35
Registriert: 10.06.2010 22:53

Re: EventwParam() und EventlParam()

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

Re: EventwParam() und EventlParam()

Beitrag 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.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: EventwParam() und EventlParam()

Beitrag 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.
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
KPA
Beiträge: 35
Registriert: 10.06.2010 22:53

Re: EventwParam() und EventlParam()

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

Re: EventwParam() und EventlParam()

Beitrag 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.
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
c4s
Beiträge: 1235
Registriert: 19.09.2007 22:18

Re: EventwParam() und EventlParam()

Beitrag von c4s »

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
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: EventwParam() und EventlParam()

Beitrag 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 :wink:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Antworten