Entwickler-Ecke
Windows API - sendmessage empfangen & co
Moritz M. - Mi 23.10.02 13:23
Titel: sendmessage empfangen & co
Hi
Ich habe im Forum nach sendmessage gesucht, einige Beiträge gefunden, die mir leider alle nicht weiterhielfen. :(
Nun Frage Ich das mal:
Welchen Code brauche ich, um, sobald eine msg ankommt, dieses anzuzeigen?
cu
Onz
Anonymous - Mi 23.10.02 15:29
Ich hab leider keine Ahnung wie der Prozedurtyp genannt wirt, ich nenne es
Messageprozedur. Ob das eine richtige Bezeichnung ist weiss ich allerdings nicht.
Zuerst ein wenig Code:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26:
| type TForm1 = class(TForm) private { Private-Deklarationen } public { Public-Deklarationen } procedure WMSysCommand(var Msg: TWMSysCommand); message WM_SYSCOMMAND; end;
var Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.WMSysCommand; begin if (Msg.CmdType = SC_MINIMIZE) then begin ShowMessage('Das Fenster wird nun minimiert'); end; if (Msg.CmdType = SC_MAXIMIZE) then begin ShowMessage('Das Fenster wird nun maximiert'); end; inherited; end; |
Wichtig ist diese Zeile
Quelltext
1:
| procedure WMSysCommand(var Msg: TWMSysCommand); message WM_SYSCOMMAND; |
Diese Prozedur fängt alle Messages die an das Formular gesendet werden. Zusamengesetzt ist die aus:
WMSysCommand - Auch wenn der Name jetzt wichtig aussieht, so ist es nut eine Bezeichnung. Es wird meistens eine Bezeichnung gewählt die der Message ähnlich ist. Ist aber kein Muß.
(var Msg: TWMSysCommand) - Parameter und sehr wichtig. Mit der Message werden Parameter mitgeschickt. Es handelt sich hier um eine Recordvariable die mehrere Werte enthalten kann. Vor der Variable muß das VAR stehen. Dadurch ist es Möglich die Werte zu überschreiben. Abhängig von der Message ist auch der Variablentyp. Was für ein Typ es sein soll steht meistens in der Hilfe dabei. Bei selbstdefinierten Messages kann die TMessage genommen werden.
message WM_SYSCOMMAND - Die Message. Es gibt Listen mit allen Messages und deren bedeutung. Stehen irgendwo in der API. Ist eingentlich eine Konstante für ein Integerwert. Man kann auch eine eigene Message definieren.
Moritz M. - Mi 23.10.02 15:50
Werds so mal probieren
cu
Onz
AndyB - Mi 23.10.02 16:41
| Popov hat folgendes geschrieben: |
| Ich hab leider keine Ahnung wie der Prozedurtyp genannt wirt |
Hinter
message Xyz; stecken dynamische Methoden, die dieselben Eigenschaften wie virtuelle Methoden besitzen. Nur verbrauchen dynamische Methoden weniger Speicherplatz als virtuelle, sind jedoch im Aufruf um einiges langsamer als virtuelle Methoden, da zuerst in der DMT (dynamic method list) die passende ID (Xyz) gefunden werden muss, wobei auch die DMTs der Vorfahrklassen durchsucht werden müssen (die VMT enthält auch die virtuellen Methoden der Vorfahrklassen, was den Speicherverbrauch bewirkt). Zur Geschwindigkeitsoptimierung wurde ein kleiner "Cache" eingebaut, der die ID=>Adresse Zuweisung der zuletzt aufgerufenen dynamische Methode zwischenspeichert.
Das Message-System der VCL kann durch das Vorhandensein der DMT, in der ja für jede dynamische Methode ein ID=>Adresse Eintrag vorhanden ist, diese ID=>Adresse Zuweisung für die Botschaften leicht misbrauchen, weil eine Botschaft auch eine ID, nämlich Message.Msg, enthält.
Moritz M. - Mi 23.10.02 17:45
Hi
Noch eine Frage:
Wie kann Ich verschickte Strings empfangen
Es wird so versendet:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| ...
const MY_MESSAGE = WM_USER + 4242;
...
SendMessage(FindWindow(nil,PChar('MeinFenster')), MY_MESSAGE, 0, DWORD(PChar('Hallo')));
... |
cu
Onz
Moritz M. - Mi 23.10.02 17:53
Ach, noch was
Die Message soll aus einer .dll gesendet werden. Gibt es sonst noch eine kommunikationsmethode zwischen .dll und dem Programm
Anonymous - Mi 23.10.02 19:39
| Onz hat folgendes geschrieben: |
Hi
Noch eine Frage:
Wie kann Ich verschickte Strings empfangen
Es wird so versendet:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| ...
const MY_MESSAGE = WM_USER + 4242;
...
SendMessage(FindWindow(nil,PChar('MeinFenster')), MY_MESSAGE, 0, DWORD(PChar('Hallo')));
... |
|
Sind das zwei Programme? Wenn du eine Message an dein eigenes Fenster schickst, dann brauchst du kein FindWindow(nil,PChar('MeinFenster')). Einfach das Handle des Fensters angeben.
Wie das empfangen wird steht in meinem Beispiel.
Moritz M. - Do 24.10.02 11:54
So, nun hab ich das ganz mal probiert. Die Nachricht wurde anscheinend auch verschickt. Aber seitdem Ich die Prozedur hab kommen Immer wenn Ich Irgendwas in meinem Fenster mache Zugriffserrors.
Und manchmal meckert auch mein CoolTrayCompo....
Gibt es eine andere Methode der Kommunikation zwischen der .dll und meinem Porg.
Wie wäre es wenn Ich in die .dll ne Funktion reinschreibe, die prüft, ob was neues vorhanden ist, diese exportiere und dann alle 0.x secunden prüfe, ob was neues da ist?
Was anderes fällt mir gerade ed ein...
Anonymous - Do 24.10.02 15:24
Messages - das ist die Art wie Windows funktioniert. Bei jeder Kleinigkeit wird eine Message ausgesendet. In eine Sekunde werden einige hundert Messages versendet. Das ist also nicht irgendein Trick, sondern die normale Art. Delphi nimt uns da vieles an Messages ab, das bedeutet aber nicht, daß es bei Delphi ohne geht.
Du hast irgendwo ein Fehler gemacht. Zeig ihn uns (den Code) und wir können dir vielleich helfen.
//Edit
Fehler korrigiert
Moritz M. - Do 24.10.02 16:41
Hi
Ne, Ich habe nun eigentlich vor das von .dll nach .exe über ein Socket zu Regeln. Ich weiß zwar, dass das umständlich ist, aber einem Mann in Not fällt immer was ein... :wink:
Oder gibt es andere Methoden?
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!