WM_APPCOMMAND - Nur benötigte Commandos abfangen?!
Also wie kann ich WM_APPCOMMAND so behandeln, dass ich nicht einfach alle Messages abfange, sondern nur die, die ich wirklich benötige und die anderen völlig unberührt bleiben, so als ob mein prog keinen Focus hätte??
meine Frage bezieht sich auf den Thread: http://www.delphipraxis.net/internal...t.php?t=141690 Ja ich weiß, dass mein Vorgehen mit den Threads unbeliebt ist aber ich weiß mir nichtmehr anders zu helfen. Doku spuckt mir auch nicht das aus, was ich brauche. Und alle anderen Threads beziehen sich nur dazu, wie man WM_APPCOMMAND's überhaupt nutzen kann. Schonmal hoffentlich Big THX im Vorraus und nochmals Thx für das Verständnis! mfg. chri_ri |
Re: WM_APPCOMMAND - Nur benötigte Commandos abfangen?!
Hast du das hier beachtet?
Zitat:
|
Re: WM_APPCOMMAND - Nur benötigte Commandos abfangen?!
hm also soll ich in dem case bei else einfach result := false oder so ähnlich zurück geben, damit es ignoriert wird von meinem tool?
mfg. chri_ri |
Re: WM_APPCOMMAND - Nur benötigte Commandos abfangen?!
Also das will irgendwie so nicht funktionieren:
Delphi-Quellcode:
Die Funktionen in meinem Tool funktionierten zwar wieder wunderbar aber irgendwie werden die nicht benötigten nicht weitergereicht.
procedure TMain.MultiKey(var Msg: TMessage);
begin case Msg.lParam of $B0000: if radio <> 3 then Switch(radio + 1); $C0000: if radio <> 0 then Switch(radio - 1); $D0000: if btn_play.Caption = 'II' then btn_play.Click; $E0000: btn_play.Click; else begin Msg.Result := 0; end; end; end; Was mache ich falsch? Und sorry für den Push. Erstmal thx! mfg. chri_ri |
Re: WM_APPCOMMAND - Nur benötigte Commandos abfangen?!
und die defwindowproc vielleicht noch aufrufen (im else)
|
Re: WM_APPCOMMAND - Nur benötigte Commandos abfangen?!
@sirius:
Erstmal Thx, aber wie benutze ich das? so:?
Delphi-Quellcode:
Hab jetzt übrigens meinen code ein wenig geände (Den Message-Typ und im Case von wparam zu lparam):
else Msg.Result := DefWindowProc(0, msg.Msg, msg.WParam, msg.LParam);
Delphi-Quellcode:
Bin noch relativ Neuling auf dem Gebiet der Messages.
procedure TMain.MultiKey(var Msg: TMessage);
begin case Msg.lParam of $B0000: if radio <> 3 then Switch(radio + 1); $C0000: if radio <> 0 then Switch(radio - 1); $D0000: if btn_play.Caption = 'II' then btn_play.Click; $E0000: btn_play.Click; else Msg.Result := DefWindowProc(0, msg.Msg, msg.WParam, msg.LParam); end; end; mfg. chri_ri |
Re: WM_APPCOMMAND - Nur benötigte Commandos abfangen?!
anstatt 0 nimmst du self.handle.
Edit: Als Alternative kannst du auch mal versuchen die Methode DefaultHandler (der VCL) aufzurufen. |
Re: WM_APPCOMMAND - Nur benötigte Commandos abfangen?!
Zitat:
|
Re: WM_APPCOMMAND - Nur benötigte Commandos abfangen?!
Geil Danke, ihr seid die besten!^^ Ich weiß schon, warum ich in diesem Forum poste^^
Also habe jetzt beide Varianten probiert. inherited und self.handle geht^^ Wie immer ist die einfachste die beste Lösung XD Naja ich denke sowieso imma bissl kompliziert XD Also hier nochmal die komplette Lösung für alle, die eventuell selber mal sowas benötigen:
Delphi-Quellcode:
type
TMain = class(TForm) procedure MultiKey(var Msg: TMessage); message WM_APPCOMMAND; private { Private declarations } public { Public declarations } end; procedure TMain.MultiKey(var Msg: TMessage); begin case Msg.lParam of $B0000: if radio <> 3 then Switch(radio + 1); $C0000: if radio <> 0 then Switch(radio - 1); $D0000: if btn_play.Caption = 'II' then btn_play.Click; $E0000: btn_play.Click; else begin inherited; // oder Msg.Result := DefWindowProc(self.Handle, msg.Msg, msg.WParam, msg.LParam); end; end; end; mfg. chri_ri |
Re: WM_APPCOMMAND - Nur benötigte Commandos abfangen?!
:gruebel: bei mir (D7) gibt es keine inhertied Methode mit WM_APPCommand, aber wenn es funktioniert....
|
Re: WM_APPCOMMAND - Nur benötigte Commandos abfangen?!
Zitat:
|
Re: WM_APPCOMMAND - Nur benötigte Commandos abfangen?!
Ich wollte ja nur grad nachsehen, was dort gemacht wird. Aber ich habe keine Methode gefunden.
|
Re: WM_APPCOMMAND - Nur benötigte Commandos abfangen?!
Zitat:
ps: "..., call dword ptr [ecx-$10]" ist "DefaultHandler(Msg)". |
Re: WM_APPCOMMAND - Nur benötigte Commandos abfangen?!
Dazu müsste ich erstmal das Programm schreiben.
inherited (für Messages) ist im Standardfall der Defaulthandler? Ist ja eine ganz neue Erkenntnis. Edit: Das ist ja interessant. Das musste ich jetzt doch einmal durchtesten. Der Defaulthandler wird schon in TObject als virtuelle Methode deklariert und wird für Message-Methoden (welche ja dynamisch sind) immer bei inherited aufgerufen. Weiß nicht, ob das so bekannt ist. Mir war es nicht bekannt. Denn bisher wusste ich nur, dass ein inherited nur ausgeführt wird, wenn:
==>Also neben der Methode Dispatch ist auch noch die Methode DefaultHandler (beide von TObject implementiert) wichtig für Message-Methoden. |
Re: WM_APPCOMMAND - Nur benötigte Commandos abfangen?!
Zitat:
"inherited" ist die beste Lösung, da der Compiler sich darum kümmert, was aufgerufen werden muss. Bei WM_ACTIVATE wäre es (in meiner Delphi-Version) TCustomForm.WMActivate() - aber das braucht den Entwickler nicht zu interessieren (und kann sich auch von Delphi-Version zu Delphi-Version ändern). Würdest du DefWindowProc() aufrufen, dann würdest du die "Vererbung" aufbrechen und diverse Handler übergehen. |
Re: WM_APPCOMMAND - Nur benötigte Commandos abfangen?!
Ich hab das nochmal in meinem Edit zusammengefasst. Das ist ein etwas anderes Verhalten als ich von inherited erwartet hätte. Das kann man ja in Zuklunft sicher gewinnbringend einsetzen.
|
Re: WM_APPCOMMAND - Nur benötigte Commandos abfangen?!
Hm ist ja interessant. Also ist inherited; die beste Lösung, weil die dem Compiler mehr Spielraum lässt um die optimalere Lösung zu finden. Ok, habe sowieso inherited genommen, schon weils einfach "smaller" ist. Aber ertsmal Thx für die Zusatzinfo am Rande.
mfg. chri_ri |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:50 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz