![]() |
Re: Problem mit Nachricht aus DLL
Meine Mouse-Hook:
Delphi-Quellcode:
PHookData = ^THookData;
THookData = packed record hk, hWnd, wmNotify : Cardinal; end;
Delphi-Quellcode:
function MouseHook(iCode : Integer; dwMsg : Cardinal; pMouseData : PMouseHookStruct) : Integer;
var pData : PHookData; hMap : Cardinal; pt : TSmallPoint; begin hMap := OpenFileMapping(FILE_MAP_ALL_ACCESS, false, csFileMappingMouse); if hMap = 0 then Result := 0 else begin pData := MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, 0, 0, 0); if (iCode = HC_ACTION) then if pData^.hWnd <> 0 then begin pt := PointToSmallPoint(pMouseData^.pt); PostMessage(pData^.hWnd, pData^.wmNotify, dwMsg, PCardinal(@pt)^); end; Result := CallNextHookEx(pData^.hk, iCode, dwMsg, Integer(pMouseData)); UnmapViewOfFile(pData); CloseHandle(hMap); end; end; |
Re: Problem mit Nachricht aus DLL
@neolithos:
Könntest du mir bitte deinen kompletten Moushook geben? Das wäre sehr hilfreich.. Danke |
Re: Problem mit Nachricht aus DLL
Zum Registrieren:
Delphi-Quellcode:
var hMap : Cardinal = 0;
hLib : Cardinal = 0; procedure RegisterMouseHook(hWnd, wmNotify : Cardinal); var pData : PHookData; proc : Pointer; begin if hMap = 0 then try hLib := LoadLibrary('Hk.dll'); if hLib = 0 then raise Exception.Create('Hk.dll nicht gefunden.'); proc := GetProcAddress(hLib, 'MouseHook'); if proc = nil then raise Exception.Create('Hook-Procedure nicht gefunden.'); hMap := CreateFileMapping(0, nil, PAGE_READWRITE, 0, SizeOf(THookData), csFileMappingMouse); if hMap = 0 then raise Exception.Create('Filemapping fehlgeschlagen'); pData := MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, 0, 0, 0); pData^.hWnd := hWnd; pData^.wmNotify := wmNotify; pData^.hk := SetWindowsHookEx(WH_MOUSE, proc, hLib, 0); if pData^.hk = 0 then raise Exception.Create('Hook konnte nicht installiert werden.'); UnmapViewOfFile(pData); except FreeLibrary(hLib); CloseHandle(hMap); raise; end; end; procedure UnRegisterMouseHook; var pData : PHookData; begin if hMap <> 0 then begin pData := MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, 0, 0, 0); UnhookWindowsHookEx(pData^.hk); UnmapViewOfFile(pData); FreeLibrary(hLib); CloseHandle(hMap); hMap := 0; end; end; |
Re: Problem mit Nachricht aus DLL
In der Anwendung:
Delphi-Quellcode:
TMouseHookMsg = packed record
dwMsg, dwMouseMsg : Cardinal; pt : TSmallPoint; end;
Delphi-Quellcode:
TForm1 = ....
procedure WMMouseNotify(var Message : TMouseHookMsg); message WM_APP + 11; ....
Delphi-Quellcode:
procedure TfrmMain.WMMouseNotify(var Message: TMouseHookMsg);
begin with Message do Label4.Caption := Format('x: %d y: %d', [pt.x, pt.y]); end;
Delphi-Quellcode:
constructor TForm1.Create(fOwner: TComponent);
begin inherited; RegisterMouseHook(Handle, WM_APP + 11); end; destructor TForm1.Destroy; begin UnRegisterMouseHook; inherited; end; |
Re: Problem mit Nachricht aus DLL
Ich habe jetzt eine Lösung gefunden die einigermaßen läuft:
Delphi-Quellcode:
Aber sobald ich mit dem Mauszeiger aus meinem Programm gehe kommt eine Fehlermeldung
function MouseHookFunc(Code: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
var Mousespos: MOUSEHOOKSTRUCT; begin //Nachricht an Fenster weiterleiten Result := CallNextHookEx(hMouseHook, Code, wParam, lParam); // Nachricht auswerten if Code >= 0 then begin hMap := OpenFileMapping(FILE_MAP_WRITE, False, 'MMF'); HookRec := MapViewOfFile(hMap, FILE_MAP_WRITE, 0, 0, 0); if HookRec <> nil then hApp := HookRec.AppHnd; Mousepos.pt := Mouse.CursorPos; SendMessage(hApp, WM_MOUSEHOOK, wparam, Integer(@Mousepos)); UnmapViewOfFile(HookRec); CloseHandle(hMap); end else Exit; end; und zwar eine Zugriffsverletzung in meiner EXE. Woran könnte das liegen? |
Re: Problem mit Nachricht aus DLL
Das hatte ich schon mal gesagt!
Diese Adresse gibt es nicht mehr! Grund: deine Hook wurde in einen anderen Adress-Space aufgerufen. Dieser hat andere Adressen! Die in deinem Programm nicht gültig sind. Schau die genau an was ich gemacht habe! Will man mehr als 4 Byte übertragen, muss entweder ein FileMapping oder eine Pipe eingerichtet werden. Achte dabei aber darauf, dass Windows ein Multi-Prozess OS ist. |
Re: Problem mit Nachricht aus DLL
@Neolithos
1. Welche Adresse meinst du? 2. An welcher Stelle bekommst du denn die aktuellen Mauskoords in deinem Hook? |
Re: Problem mit Nachricht aus DLL
Moin!
Zu 1.:
Code:
Integer(@Mousepos) meint er - du verschickst hier die Adresse der Mauspos Struktur - die auch ohne DLL/App ungültig wäre, da du die Adresse einer lokalen Variable verschickst - und die ist eh ungültig nach verlassen der Funktion.
SendMessage(hApp, WM_MOUSEHOOK, wparam, Integer(@Mousepos));
MfG Muetze1 |
Re: Problem mit Nachricht aus DLL
@Chris P
Bei einem globalen Hook gilt, dass die DLL (also auch die Variablen darin oder Ptr auf diese Variablen) dann fast immer im Adressraum einer jeweils fremden Application untergebracht ist. Dementsprechend haben von dort verschickte Adressen dann in deinem eigenen Prog natürlich keine Gültigkeit mehr (weil doch jede Appllication ihren ganz 'persönlichen' eigenen Adressraum hat). Nur dann, wenn diejenige HookProc aktiv ist, die beim Erstellen deines globalen Hooks dann auch im Adressraum deines aktuellen Programmes aufgebaut wurde, ..nur dann event. könnte so ein Pointer auch dementsprechend überhaupt brauchbar sein (also nur wenn die Maus gerade über deiner Form1 ist ..wie das ja bei dir der Fall war). Da man für eine Mitteilung von X/Y-Screen-Koordinaten wohl immer nur 2*2 Bytes benötigen wird, könntest du diese aber z.B. auch über den LParam direkt verschicken:
Code:
var X,Y : Word;
... X := PMouseHookStruct(lParam)^.pt.x; Y := PMouseHookStruct(lParam)^.pt.y; PostMessage(HookRec^.AppHnd, WM_MOUSEHOOK, wp, X*65536 + Y); edit: lp --> lParam / war 'ne eigene Kurzfassung zum schnelleren Austesten |
Re: Problem mit Nachricht aus DLL
Moin!
Zitat:
MfG Muetze1 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:14 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