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 HWND_Broadcast abfangen (https://www.delphipraxis.net/131211-hwnd_broadcast-abfangen.html)

ecHo89 20. Mär 2009 16:09


HWND_Broadcast abfangen
 
Hi,

bin seit mehr als 1 Woche am grübel bekomms, aber einfach net gebacken...

In der DLL:
Delphi-Quellcode:
 lpView: TDLLData;
          CopyMemory(@lpView^.mouse, PMOUSEHOOKSTRUCT(lParam), sizeof(TMOUSEHOOKSTRUCT));
          SendMessage(HWND_BROADCAST, lpView^.WM_MOUSEHOOKMSG, wParam, lParam);
In meinem Programm:

Delphi-Quellcode:
function InstallHooks(Hwnd: HWND): Boolean; stdcall; external 'hooks.dll' name 'InstallHooks';
function UninstallHooks: Boolean; stdcall; external 'hooks.dll' name 'UninstallHooks';

var WM_MOUSEHOOKMSG:cardinal;

InstallHooks(Application.Handle);

procedure TFormMain.GetHWNDBroadcast(var Msg: TMsg);
begin
if Msg.message = WM_MOUSEHOOKMSG then
 begin
    Memo1.Lines.Add(IntToStr(Msg.hwnd));
    (Self.Refresh;)
 end;
 (inherited;)
end;

procedure TformMain.FormCreate(Sender: TObject);
begin
  WM_MOUSEHOOKMSG := RegisterWindowMessage('WM_MOUSEHOOKMSG');
end;
Scheint irgendwas an der Verarbeitung von lpView zu hängen...?
Vielen Dank für alle Tipps :)

ecHo89 23. Mär 2009 14:38

Re: HWND_Broadcast abfangen
 
habe immer noch keine funktionierende möglichkeit gefunden, trotz viel suchen und probieren

quendolineDD 23. Mär 2009 14:46

Re: HWND_Broadcast abfangen
 
Wird GetHWNDBroadcast überhaupt aufgerufen? Hast du auch die Message bei der Definition mit dazugeschrieben?
Delphi-Quellcode:
procedure GetHWNDMessage(Msg : TMsg); Message WM_MOUSEHOOKMSG;

ecHo89 23. Mär 2009 14:51

Re: HWND_Broadcast abfangen
 
[Fehler] runmiddlebutton.pas(18): Undefinierter Bezeichner: 'WM_MOUSEHOOKMSG'
[Fehler] runmiddlebutton.pas(18): Ungültiger Botschaftsmethoden-Index

Wenn ich das mit dem message dahinter mache

lbccaleb 23. Mär 2009 14:53

Re: HWND_Broadcast abfangen
 
Deine eigene Message muss natürlich auch Deklariert sein..

ecHo89 23. Mär 2009 14:59

Re: HWND_Broadcast abfangen
 
Liste der Anhänge anzeigen (Anzahl: 1)
So bekomme keinen Fehler mehr, aber woher weiß ich welchen Wert ich hinter WM_USER brauche?

Kann meine TMSG auch behandeln und im Memo ausgeben, aber alle Werte sind 0, d.h. irgendwie empfang ich die Message nicht richtig.

ecHo89 23. Mär 2009 15:28

Re: HWND_Broadcast abfangen
 
Habe jetzt WM_USER = 400, da =1 fehler produzieren könnte.

Habe ein bisschen mit dem Pointer experimentiert und direkt ein Debugging Exeption ausgelöst, d.h. es ging gar nix mehr... Taskmanager ist zwar noch aufgegangen konnte aber mit der Tastur und Maus nicht bedient werden. Diese Sachen sind nicht in der ZIP-Datei drin. Die Version läuft stabil, aber es kommen halt keine Daten an :(

quendolineDD 23. Mär 2009 15:32

Re: HWND_Broadcast abfangen
 
Ich persönlich teste Sachen, die zB im winlogon mitgeladen werden in einer Virtual Machine. Dann sind solche Abstürze kein Problem und in 20 Sekunden ist dass Betriebsystem neu geladen.

ecHo89 23. Mär 2009 15:36

Re: HWND_Broadcast abfangen
 
okay, magst du dir mal die ZIP angucken. 100% lauffähig, aber die Message ist halt einfach leer :/

ecHo89 25. Mär 2009 16:14

Re: HWND_Broadcast abfangen
 
Habe es jetzt einfach so gemacht (ich möchte im Moment ja eh nur registrieren, ob Mausklick und dann die Position)

GetCursorPos
und dann ne WM_COPYDATA Message mit den Koordinaten. Aber das Problem is GetCursorPos, da es nur die Position auf der Form anzeigt. Wie kann ich aus lpView: PDLLData (PDLLData^=TDLLData) diese Information (Mauspunkt) holen?

Delphi-Quellcode:
const
MMFName = 'HookingSampleDLL_Data';
type
TDLLData = packed record
wnd:HWND;
ProcessID,
ThreadID:DWORD;
nCode: Integer;
WM_MOUSEHOOKMSG,
WM_KEYBHOOKMSG: UINT;
mouse: TMOUSEHOOKSTRUCT;
end;
PDLLData = ^TDLLData;
var
lpView: PDLLData;
hMap: THandle;
Ich weiß einfach nich wie ich aus dem FileMapping, diese Infos herausbekomme, habe schon sehr viel versucht und gesucht... (wollt gar nich wissen, wie mein Desktop aussieht... :/)

Gruß Malte

stoxx 25. Mär 2009 16:42

Re: HWND_Broadcast abfangen
 
bittesehr ...

http://delphi.about.com/od/windowssh...lphi-hooks.htm

ecHo89 25. Mär 2009 22:41

Re: HWND_Broadcast abfangen
 
dort wird sogar korrekt der Mauspunkt inner HookProc verarbeitet, aber wenn ich diese Infos sende (x,y), funktioniert es nur wenn die Maus über der Form ist. Obwohl das Programm in der Verarbeitung mit den Daten korrekt arbeiten kann.

Muss ich ein packed record übergeben? Wieso reicht es nicht aus .x und .y zu übergeben, wenn diese doch korrekt sind?


Delphi-Quellcode:
mousePoint := PMouseHookStruct(Data)^.pt; (data=lparam)

 SendMessage(FindWindow('TMainHookTestForm', nil), WM_COPYDATA,mousePoint.x,mousePoint.Y);

himitsu 25. Mär 2009 22:50

Re: HWND_Broadcast abfangen
 
Delphi-Quellcode:
SendMessage(FindWindow('TMainHookTestForm', nil), WM_COPYDATA, PMouseHookStruct(Data)^.pt.X, PMouseHookStruct(Data)^.pt.Y);

// oder
// oder
// ...
// nja, egal wie, hauptsache X und Y weden übergeben ^^

H := FindWindow('TMainHookTestForm', nil);
SendMessage(H, WM_COPYDATA, X, Y);

Luckie 25. Mär 2009 23:10

Re: HWND_Broadcast abfangen
 
@himitsu: Ich prophezeie mal, dass das nicht kompilieren wird. ;)

himitsu 25. Mär 2009 23:49

Re: HWND_Broadcast abfangen
 
meinst du das vergessene X?

Luckie 25. Mär 2009 23:49

Re: HWND_Broadcast abfangen
 
Zitat:

Zitat von himitsu
meinst du das vergessene X?

:zwinker:

ecHo89 26. Mär 2009 13:47

Re: HWND_Broadcast abfangen
 
Liste der Anhänge anzeigen (Anzahl: 1)
ich weiß nicht, ob ihr mein problem erkennt...
Delphi-Quellcode:
SendMessage(FindWindow('TMainHookTestForm', nil), WM_COPYDATA, PMouseHookStruct(Data)^.pt.X, PMouseHookStruct(Data)^.pt.Y);
ist ja das gleiche wie
Delphi-Quellcode:
mousePoint := PMouseHookStruct(Data)^.pt; (data=lparam)

SendMessage(FindWindow('TMainHookTestForm', nil), WM_COPYDATA,mousePoint.x,mousePoint.Y);
aber das problem ist, sobald die maus nicht mehr auf der form ist, keine koordinaten mehr angezeigt bzw. aktualisiert werden...


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