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 Windows Message in Klasse (https://www.delphipraxis.net/79629-windows-message-klasse.html)

nitschchedu 25. Okt 2006 15:55


Windows Message in Klasse
 
Wie kann ich in meine Klasse die Message WM_TIMECHANGE ? da kommt nichts an !

Sunlight7 25. Okt 2006 17:16

Re: Windows Message in Klasse
 
1. Ein Hallo und freundlicherer Umgang wäre nicht schlecht
2. Welche Klasse?
3. Was hast Du bereits gemacht? Quelltext wäre zum helfen hilfreich.
4. "da kommt nichts an !" = ?

SirThornberry 25. Okt 2006 17:40

Re: Windows Message in Klasse
 
um windowmessages zu bekommen musst du auch ein Window haben. Die muss zwar nicht zwangsläufig ein sichtbares sein aber eine einfache Klasse von TObject abgeleitet hat eben kein solches Handle. Es wäre also interessant zu wissen wovon du abgeleitet hast.

nitschchedu 26. Okt 2006 07:20

Re: Windows Message in Klasse
 
Als erstes bekommt Sunlight7 sein Hallo alle zusammen. :-D

Ich habe es mit WinControl versucht, welche Klasse wäre den dafür geeignet ?

Bis jetziger Code ist

Delphi-Quellcode:
 TTimeCheck = class(TWinControl)
 private
  Timer: TTimer;
  procedure WMTimeChange(var Msg: TMessage); message WM_TIMECHANGE;
  procedure TimeEdit(Sender: TObject);
 public
  constructor Create;
  destructor Destroy; override;
 end;

nitschchedu 26. Okt 2006 09:58

Re: Windows Message in Klasse
 
Habe es jetzt so versucht

Delphi-Quellcode:

unit nduComponent;

interface

uses
  Windows, Messages, SysUtils, Classes, Forms, Dialogs;

type
  TnduWindowHook = function(var Message: TMessage): Boolean of Object;
  TnduOnReceiveUserMessage = procedure(Msg: Cardinal; wParam, lParam: Integer;
    var Handled: Boolean) of object;
  TnduOnReceiveOtherMessage = procedure(var Handled: Boolean) of object;

  TnduComponent = class(TComponent)
    function MessageHook(var Msg: TMessage): Boolean; virtual;
  private
    FHooked: Boolean;
    FOnReceiveUserMessage: TnduOnReceiveUserMessage;

    procedure SetOnReceiveUserMessage(const Value: TnduOnReceiveUserMessage);
  protected
    function DoUserMessage(Msg: TMessage): Boolean; dynamic;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
    property OnReceiveUserMessage: TnduOnReceiveUserMessage read FOnReceiveUserMessage write SetOnReceiveUserMessage;
  end;


implementation

{ TnduCompoent }

constructor TnduComponent.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);

  FHooked := False;

  if not (csDesigning in ComponentState) then
  begin
    Application.HookMainWindow(MessageHook);
    FHooked := True;
  end;

end;

destructor TnduComponent.Destroy;
begin
  if FHooked then
  begin
    Application.UnhookMainWindow(MessageHook);
  end;

  inherited Destroy;
end;

function TnduComponent.DoUserMessage(Msg: TMessage): Boolean;
begin
  Result := False;

  if Assigned(FOnReceiveUserMessage) then
  begin
    FOnReceiveUserMessage(Msg.Msg, Msg.wParam, Msg.LParam, Result);
  end;
end;

function TnduComponent.MessageHook(var Msg: TMessage): Boolean;
begin
  Result := False;
end;

procedure TnduComponent.SetOnReceiveUserMessage(
  const Value: TnduOnReceiveUserMessage);
begin
  FOnReceiveUserMessage := Value;
end;

end.
doch die NDU_WM_MMFNOTIFY = WM_USER + 1;

kommt nich an :wall:

nitschchedu 26. Okt 2006 10:55

Re: Windows Message in Klasse
 
Ich habe jetzt festgestellt das die normalen Windwos Meassages da ankommen

Delphi-Quellcode:
function TnduProKumRecv.MessageHook(var Msg: TMessage): Boolean;
begin
  Result := False;

  case Msg.Msg of
    NDU_WM_MMFNOTIFY:
    begin
      ProRecv(Msg);
      Result := True;
    end;
  end;

end;
Warum kommt dann meins nicht an ? :gruebel:

Sunlight7 26. Okt 2006 12:31

Re: Windows Message in Klasse
 
Hallo nitschchedu!

So ist besser :wink:

Also ich hab mir das angesehen, Du mußt entweder
  • in der Form die Message abfangen
  • einen Hook auf eine Form machen
  • einfach die Application Messages beobachten

Denn die WM_TimeChange Message wird nur an die Übergeordneten Fenster versendet, deshalb erreicht die Nachricht eine TWinControl nicht.

Grüßle!

nitschchedu 26. Okt 2006 13:08

Re: Windows Message in Klasse
 
Würde den die WM_COPYDATA ankommen wenn ich es so wie oben lasse?
Oder was würdest du mir empfehlen ? :gruebel: :roteyes:
Ach ja und ein Dienst würde der auch eine Windows Message bekommen ?

Sunlight7 26. Okt 2006 13:20

Re: Windows Message in Klasse
 
Wie, oben? Da stehen mehrere Varianten. :wink:

Die WM_COPYDATA wird ja nicht von Windows gesendet, sondern von Deinem Programm aus, ergo muß es das Fenster (in diesem Fall auch TWinControl), welches als Empfänger angegeben ist, diese empfangen können.

Dienste können im Normalfall Messages erhalten, aber das ist leider nicht mein Fachgebiet :stupid:

Ein Tipp: Guck für die Messages in die OH bzw. bei MS MSDN-Library durchsuchenWM_COPYDATA & MSDN-Library durchsuchenWM_TIMECHANGE, :wink:

nitschchedu 26. Okt 2006 13:39

Re: Windows Message in Klasse
 
Ok Dank für die Hilfe! :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:54 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