Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Abfangen einer Message ans eigene Programm (https://www.delphipraxis.net/11203-abfangen-einer-message-ans-eigene-programm.html)

absoluter_beginna 1. Nov 2003 20:56


Abfangen einer Message ans eigene Programm
 
Nabend!

Wie kann ich eine Message, die an mein erstelltes Delphi-Programm geschickt wurde abfangen und in einem Memofeld auflisten lassen (z.B. auf Knopfdruck)???

Ich hoffe, ihr versteht, was ich meine. Falls nicht, könnt ihr ja nachfragen.

Bis dann

P.S. Bin ich zu doof, oder kann mir mal jemand sagen, wie man hier Smilies einfügt? Liegt's vielleicht am Browser, dass es nicht klappt? Benutze Opera.

Niels 1. Nov 2003 21:07

Re: Abfangen einer Message ans eigene Programm
 
Soll da über Netzwerk oder so ne Message geschickt werden oder wie soll dein Prgramm ne Message empfangen? Dazu musste dann die entsprechende Komponente aufs Formular tun.
Was willst du eigentlich coden? :spin2:


Wegen den Smileys...mussteigentlich nur links drauf drücken, dann haste den Code vom Smiley hier drin.

MfG Niels

CalganX 1. Nov 2003 22:04

Re: Abfangen einer Message ans eigene Programm
 
Hi,
die Frage ist, was du nun meinst: meinst du eine Nachricht, die über Netzwerk an deinen Rechner gesendet wurde, oder eine Nachricht, du Windows oder ein anderes Control/Window an dein Fenster gesendet hat?

Chris

Daniel 1. Nov 2003 22:10

Re: Abfangen einer Message ans eigene Programm
 
/me verschiebt das mal nach WinAPI. :wink:
Mit freundlichen Grüßen,
Ihre administrative Service-Kraft

absoluter_beginna 1. Nov 2003 22:11

Re: Abfangen einer Message ans eigene Programm
 
Also, ich meine eine Message von Windows, z.B. ne System-message. :nerd:

(is ja blöd, das mit den Smilies liegt echt an Opera)

Daniel 1. Nov 2003 22:21

Re: Abfangen einer Message ans eigene Programm
 
[offtopic]
Also am Opera im Allgemeinen liegt es unter Garantie nicht.
Vielleicht hast Du ja Javascript ausgeschaltet? Ich bin jetzt mit dem aktuelle Opera (7.21) drin und die Smilies tun, wie sie sollen. :wink:
[/offtopic]

CalganX 1. Nov 2003 22:24

Re: Abfangen einer Message ans eigene Programm
 
Hi,
wusste ich es doch. :mrgreen: @Daniel: ;) .oO(Glück gehabt)

Ich hoffe, dass ich jetzt zu so später Stunde keinen Fehler mehr mache, aber so sollte es gehen:
Delphi-Quellcode:
{Als Member von deines Forms}
procedure Abfangen(Msg: TMessage) message WM_DEINE_NACHRICHT;
{...}

procedure TfrmWin.Abfrangen(Msg: TMessage);
begin
  {mach irgendwas. Nimm am Besten Msg zur Hilfe :-) }
end;
Chris

Luckie 2. Nov 2003 00:23

Re: Abfangen einer Message ans eigene Programm
 
Nicht als Member, als Methode.

absoluter_beginna 2. Nov 2003 09:45

Re: Abfangen einer Message ans eigene Programm
 
???
Das soll alles sein? damit kann ich jede beliebige Message an mein Programm abfangen?
Entweder haben wir uns missverstanden oder ich bin echt zu blöde, das zu kapieren.
Naja, werd's erstmal ausprobieren.

MfG

Luckie 2. Nov 2003 09:53

Re: Abfangen einer Message ans eigene Programm
 
Nein, nur eine Nachricht die WM_DEINE_NACHRICHT heißt. Alle anderen bleiben im "Sieb" nicht hängen.

absoluter_beginna 2. Nov 2003 09:59

Re: Abfangen einer Message ans eigene Programm
 
Hm :oops: (jetzt funzt das mit den Smilies endlcih auch :hello: )

Ich wollte eigentlich jede beliebige Nachricht abfangen, die an mein Programm gesendet wird.

Genauer Wortlaut meiner Aufgabe:
"Listing einer Routine, die auf Knopfdruck die Messages an das eigene Programm in einem TMemo-Feld auflistet"

Also ich denke, dass damit jegliche Art von Messages gemeint is, die mein Programm empfangen kann. Nicht nur von mir eigens erstellte. :?

CalganX 2. Nov 2003 10:01

Re: Abfangen einer Message ans eigene Programm
 
Hi,
@Luckie: danke für die Korrektur!

Es gibt allerdings eine Möglichkeit ALLE Nachrichten abzufangen: die nennt sich nonVCL. Da du ja dort jede Nachricht, die dein Fenster erhält abfängst und dann verarbeitest. Allerdings kannst du nicht einfach eine Mischung aus nonVCL und VCL machen. Entweder oder.

Chris

absoluter_beginna 2. Nov 2003 10:04

Re: Abfangen einer Message ans eigene Programm
 
aaaaaaaaaaaaaaaaaaaaaaaaaaaahhhhhhh
was soll das bedeuten? @Chakotay1308

Luckie 2. Nov 2003 10:09

Re: Abfangen einer Message ans eigene Programm
 
@Chakotay: Man kann auch die WndProc überschreiben, dann kommt man auch an alle Nachrichten dran. :wink:

Delphi-Quellcode:
type
  TForm1 = class(TForm)
    ...;
  public
    { Public-Deklarationen }
  protected
    procedure WndProc(var msg: TMessage); override;
  end;

[..]

procedure TForm1.WndProc(var msg: TMessage);
begin
  case msg.Msg of
    SPM_PROGRESS: // selbst definierte Nachricht1
      begin
        ...;
      end;
    SPM_DONE: // selbst definierte Nachricht2
      begin
        ...;
      end;
  end;
  inherited;
end;

CalganX 2. Nov 2003 10:12

Re: Abfangen einer Message ans eigene Programm
 
Hi Luckie,
bah ist ja widerlich! ;)
Naja. Wenn du das sagst, dann wird das wohl stimmen! ;)

Chris

absoluter_beginna 2. Nov 2003 10:19

Re: Abfangen einer Message ans eigene Programm
 
:wiejetzt:

dazu hab ich einige fragen

Delphi-Quellcode:
procedure TForm1.WndProc(var msg: TMessage);
begin
  case msg.Msg of
    SPM_PROGRESS: // selbst definierte Nachricht1
      begin
        ...;
      end;
    SPM_DONE: // selbst definierte Nachricht2
      begin
        ...;
      end;
  end;
  inherited;
end;
spm-progress und spm_done sind selbstdefinierte nachrichten? das bedeutet, die muss ich selber vorher definieren, oder was? wenn ich aber keine selbstdefinierten nachrichten abfangen möchte sondern alle möglichen, z.b. bei der kommunikation mit windows, die nachrichten, die windows an mein progi schickt.

[edit=r_kerber]Delphi-Tags gesetzt! Mfg, r_kerber[/edit]

Luckie 2. Nov 2003 10:23

Re: Abfangen einer Message ans eigene Programm
 
Na dann nimmst du die von Windows definierten. Zu finden im PSDK oder MSDN. Die von Windows fangen alle mit WM_ an, Control spezifische mit CB_ für Combobox, LB_ für Listbox usw.

Darf man mal fragen, was das werden soll?

absoluter_beginna 2. Nov 2003 10:31

Re: Abfangen einer Message ans eigene Programm
 
Ist n Teil von nem Vortrag, den ich bald halten soll. :|
Und ich hab das Gefühl, den werd ich ganz schön in Sand setzen. Weil das is nich das einzige, wovon ich keine Ahnung hab. *grummel*
Hm, hoffe, ich krieg da noch was hingezaubert.

Luckie 2. Nov 2003 10:31

Re: Abfangen einer Message ans eigene Programm
 
Wie lautet das Thema des Vortrages und welchen Inhalt hat er? Geht es um die Funktionsweise von Windows, dann kuck mal hier: http://www.luckie-online.de/artikel/...n32api01.shtml

absoluter_beginna 2. Nov 2003 10:35

Re: Abfangen einer Message ans eigene Programm
 
ein Teil des Vortrages besteht auch aus der Kommunikation mit Windows, aber nicht nur. Nur davon hab ich am wenigsten Ahnung und dazu is auch am wenigsten in der Literatur zu finden.

Luckie 2. Nov 2003 10:36

Re: Abfangen einer Message ans eigene Programm
 
Dann sollte mein Link dir helfen.

absoluter_beginna 2. Nov 2003 10:40

Re: Abfangen einer Message ans eigene Programm
 
ja, danke :thuimb:

Luckie 2. Nov 2003 12:11

Re: Abfangen einer Message ans eigene Programm
 
So, habe mal auf die Schnelle was zusammen geschustert:
Delphi-Quellcode:
type
  TForm1 = class(TForm)
    Memo1: TMemo;
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    procedure WndProc(var msg: TMessage); override;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

var
  bShow: Boolean = False;

procedure TForm1.WndProc(var msg: TMessage);
var
  s: string;
begin
  case msg.Msg of
    WM_MOUSEMOVE:
      begin
        // leider gibt es keine Funktion, die den numerischen Wert der
        // Konstante umwandelt, deswegen alles von Hand und das macht es so
        // aufwendig
        s := 'WM_MOUSEMOVE';
        Memo1.Lines.Add(s + '= '+IntToStr(msg.Msg));
      end;
    WM_ACTIVATE:
      begin
        s := 'WM_ACTIVATE';
        Memo1.Lines.Add(s + '= '+IntToStr(msg.Msg));
      end;
    WM_CLOSE:
      begin
        s := 'WM_CLOSE';
        Memo1.Lines.Add(s + '= '+IntToStr(msg.Msg));
        Sleep(2000); // 2 Sekunden warten, wir wollen noch was sehen.
      end;
    WM_LBUTTONDOWN:
      begin
        s := 'WM_LBUTTONDOWN';
        Memo1.Lines.Add(s + '= '+IntToStr(msg.Msg));
      end;
    WM_LBUTTONUP:
      begin
        s := 'WM_LBUTTONUP';
        Memo1.Lines.Add(s + '= '+IntToStr(msg.Msg));
      end;
    WM_MOVING:
      begin
        s := 'WM_MOVING';
        Memo1.Lines.Add(s + '= '+IntToStr(msg.Msg));
      end;
    WM_SHOWWINDOW:
      begin
        s := 'WM_SHOWWINDOW';
        Memo1.Lines.Add(s + '= '+IntToStr(msg.Msg));
        bShow := True;
      end;
    WM_SIZE:
      begin
        // vor WM_SHOWWINDOW existiert das Memo noch nicht!!!
        if bShow = True then
        begin
          s := 'WM_SIZE';
          Memo1.Lines.Add(s + '= '+IntToStr(msg.Msg));
        end;
      end;
    WM_SYSCOMMAND:
      begin
        s := 'WM_SYSCOMMAND';
        Memo1.Lines.Add(s + '= '+IntToStr(msg.Msg));
      end;
    WM_PAINT:
      begin
        s := 'WM_PAINT';
        Memo1.Lines.Add(s + '= '+IntToStr(msg.Msg));
      end;
  end;
  // weiterleiten an die in der VCL eingebaute WndProc,
  // sonst reagiert unser Programm nicht mehr auf die abgefangenen Nachrichten
  inherited;
end;
Im Memo wird die Konstate angezeigt und ihr nummerischer Wert.

absoluter_beginna 2. Nov 2003 12:49

Re: Abfangen einer Message ans eigene Programm
 
Ich danke dir!
Funktioniert auch (wer hätte das gedacht? :zwinker: )
Und wie kann ich einstellen, dass er damit erst startet, wenn ich auf einen Button clicke? (und dann auch wieder damit aufhört bei nochmaligem Klicken?)

Luckie 2. Nov 2003 12:59

Re: Abfangen einer Message ans eigene Programm
 
Hmpf, Grundlagen.
Delphi-Quellcode:
var
  bShow: Boolean = False;
  bStart: Boolean = False;
Delphi-Quellcode:
procedure TForm1.WndProc(var msg: TMessage);
var
  s: string;
begin
  if bStart = True then
  begin
    case msg.Msg of
      WM_MOUSEMOVE:
        begin
          // leider gibt es keine Funktion, die den numerischen Wert der
          // Konstante umwandelt, deswegen alles von Hand und das macht es so
          // aufwendig
          s := 'WM_MOUSEMOVE';
          Memo1.Lines.Add(s + '= '+IntToStr(msg.Msg));
        end;
[..]
    // weiterleiten an die in der VCL eingebaute WndProc,
    // sonst reagiert unser Programm nicht mehr auf die abgefangenen Nachrichten
  end;
  inherited;
end;
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  bStart := not bStart;
end;

absoluter_beginna 2. Nov 2003 13:27

Re: Abfangen einer Message ans eigene Programm
 
Das war ja auch meine Idee. Nur muss ich wohl irgendwo nen Fehler eingebaut haben. Hat nämlich erst nicht funktioniert. Aber jetzte. Nochmals vielen Dank! :-D


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:08 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz