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 Fensterbotschaften(Window Messages) auslesen (https://www.delphipraxis.net/74171-fensterbotschaften-window-messages-auslesen.html)

Metal_Snake2 29. Jul 2006 14:51


Fensterbotschaften(Window Messages) auslesen
 
moin,

Wie kann ich mit einem Hook es hinkriegen alle Messages von Benutzer Prozesses auszulesen und einfach zu Protokolieren.
Mein ziel ist es wie das Proggie Wininspector Spy diw Window Messages zu Sniffen.

Reicht dazu SetWindowsHookEx ? Oder sollte ich es mit dll-injection mit hilfe der komponente von Madishi versuchen?
Hat einer eine idee wie ich das könnte?

peanut 30. Jul 2006 16:20

Re: Fensterbotschaften(Window Messages) auslesen
 
Hallo,

ich würde in einer DLL mittels

Delphi-Quellcode:
  HookHandle := SetWindowsHookEx(WH_GETMESSAGE, @HookProc, hInstance, 0);
nen hook setzen und dann die Nachrichten in der HookProc loggen:

Delphi-Quellcode:
function HookProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
var
  AMessage: PMSG;
begin
  AMessage := PMSG(lParam);
  // in AMessage^.message steht dann die Nachricht
end;
Gruß peanut.

Metal_Snake2 30. Jul 2006 23:14

Re: Fensterbotschaften(Window Messages) auslesen
 
hi peanut danke für deine antwort,

also ich habe jetzt folgednes schonmal gemacht:

Dll:

Delphi-Quellcode:
library
  WndMsgSniffer;

  uses
  Windows,
  Messages;

Type
  tag = record
    LPARAM :lParam;
    WPARAM :wParam;
    message:Cardinal;
    HWND  :hwnd;
end;
PMsg = ^Tag;

var
  HookHandle       :Cardinal;
  TargetWindowHandle:Cardinal;
  OwnWindowHandle  :Cardinal;

function GetMsgProc(code: integer; wParam: WPARAM; lParam: LPARAM): LResult; stdcall;
var
  var aCopy:TCopyDataStruct;
begin
  if (code < 0) Then
    exit
  else
    begin
     {IPC zeugs}
     with aCopy do
       begin
         dwData := PMsg(lparam).Message
         cbData := 0;
         lpData := nil;
      end;
      SendMessage(ApplicationHandle, WM_COPYDATA, Longint(HookHandle),LongInt(@aCopy));
  end;
  Result := CallNextHookEx(HookHandle, Code, wparam, lparam);
end;

function InstallHooks(Hwnd: Cardinal;OwnHwnd:Cardinal): Boolean; stdcall;
begin
  TargetWindowHandle:=Hwnd; //Handle des zu schützenden Fensters
  OwnWindowHandle:=OwnHwnd; //Handle des Hauptprogramm-Fensters

  HookHandle := SetWindowsHookEx(WH_GETMESSAGE, GetMsgProc, hinstance, GetWindowThreadProcessId(TargetWindowHandle));
  Result:=Hookhandle<>0;
end;

function UninstallHooks: Boolean; stdcall;
begin
  result:=UnHookWindowsHookEx(HookHandle);
end;

exports
  InstallHooks,
  UninstallHooks;

begin

end.


Hauptfenster:

Delphi-Quellcode:

[...]
  private
    procedure HandleMessage(var Message: TWMCopyData);
[...]

var
  Form1: TForm1;



implementation

  function InstallHooks(Hwnd: THandle;OwnHwnd:Cardinal): Boolean; stdcall; external 'WndMsgSniffer.dll';
  function UninstallHooks: Boolean; stdcall;external 'WndMsgSniffer.dll';

{$R *.dfm}

//ipc nachrichten empfangen
procedure TForm1.HandleMessage(var Message: TWMCopyData);
begin
  listbox1.items.add(IntToStr(Message.CopyDataStruct.dwData));
end;


procedure TForm1.FormCreate(Sender: TObject);
var
  Targethandle: Thandle;
begin
  //nur zum testen
  Targethandle:= FindWindow(PChar('Notepad'),PChar('Unbenannt - editor'));
  SetForegroundWindow(targethandle);

  if InstallHooks(Targethandle,application.handle) then //Hooks installieren.
    ShowMessage('Installed Successfully.');

end;
Nur leider funzt es nicht,
in der listbox wird leider reingarnix eingetragen, nein ich bekomme selbst nicht mal die "Installed Successfully" nachricht.
bin jetzt verzeifelt.........was habe ich falsch gemacht??

danke für weitere antworten.

SirThornberry 30. Jul 2006 23:20

Re: Fensterbotschaften(Window Messages) auslesen
 
schau dir mal die hilfe zu "SetWindowsHookEx" an und vor allem den letzten parameter. Zudem sollte dir klar sein das bei einem Hook die DLL in jedem Prozess erneut geladen wird wird. Somit geht es nicht das du innerhalb der DLL einfach an das Window nachrichten schickst was in einer anderen DLL instanz gesetzt wurde. Denn dieses Handle wurde eben in einer anderen DLL instanz gesetzt und nicht in jeder.

Metal_Snake2 30. Jul 2006 23:50

Re: Fensterbotschaften(Window Messages) auslesen
 
sry ich werd nicht ganz draus schlau...ich werd mir mal das tut von olli reinziehen.
aber irgendwie komme ich nicht weiter.

peanut 31. Jul 2006 21:41

Re: Fensterbotschaften(Window Messages) auslesen
 
Hallo Metal_Snake2,

Du musst im hook irgendwo an das Handle Deines Programms kommen, damit SendMessage überhaupt eine Wirkung hat (oder steckt das schon in ApplicationHandle ?). Um Dir IPC zu ersparen, kannst Du das Handle des Spys ja irgendwo in der Registry ablegen. Ist vielleicht nicht all zu schön, aber der Zweck heiligt ja bekanntermaßen die Mittel :-). Außerdem musst Du aufpassen, dass der Hook in Deinem Spy keine Nachrichten versendet, sonst wirst Du endlos mit Nachrichten bombardiert...

Was Du mit HandleMessage machst, verstehe ich nicht? Ich hätte das wie folgt gelöst:


Delphi-Quellcode:
[...]
  private
    procedure WndProc(var Message:TMessage); override;
[...]

procedure TForm1.WndProc(var Message:TMessage);
begin
  if Message.Msg = WM_COPYDATA then
  begin
    Memo1.Lines.Add('WM_COPYDATA');
    [...]
  end;

  inherited;
end;
Grüße peanut.


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