AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit Nachricht aus DLL

Ein Thema von Chris P · begonnen am 7. Jul 2004 · letzter Beitrag vom 12. Jul 2004
Antwort Antwort
Seite 3 von 4     123 4      
neolithos

Registriert seit: 31. Jul 2003
Ort: Dresden
1.386 Beiträge
 
Delphi 7 Architect
 
#21

Re: Problem mit Nachricht aus DLL

  Alt 7. Jul 2004, 12:04
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;
- ciao neo -
Es gibt niemals dumme Fragen, sondern nur dumme Antworten!
  Mit Zitat antworten Zitat
Chris P

Registriert seit: 8. Mär 2004
230 Beiträge
 
Delphi 7 Enterprise
 
#22

Re: Problem mit Nachricht aus DLL

  Alt 7. Jul 2004, 12:30
@neolithos:

Könntest du mir bitte deinen kompletten Moushook geben?

Das wäre sehr hilfreich..
Danke
  Mit Zitat antworten Zitat
neolithos

Registriert seit: 31. Jul 2003
Ort: Dresden
1.386 Beiträge
 
Delphi 7 Architect
 
#23

Re: Problem mit Nachricht aus DLL

  Alt 7. Jul 2004, 12:52
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;
- ciao neo -
Es gibt niemals dumme Fragen, sondern nur dumme Antworten!
  Mit Zitat antworten Zitat
neolithos

Registriert seit: 31. Jul 2003
Ort: Dresden
1.386 Beiträge
 
Delphi 7 Architect
 
#24

Re: Problem mit Nachricht aus DLL

  Alt 7. Jul 2004, 12:54
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;
- ciao neo -
Es gibt niemals dumme Fragen, sondern nur dumme Antworten!
  Mit Zitat antworten Zitat
Chris P

Registriert seit: 8. Mär 2004
230 Beiträge
 
Delphi 7 Enterprise
 
#25

Re: Problem mit Nachricht aus DLL

  Alt 7. Jul 2004, 14:59
Ich habe jetzt eine Lösung gefunden die einigermaßen läuft:
Delphi-Quellcode:
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;
Aber sobald ich mit dem Mauszeiger aus meinem Programm gehe kommt eine Fehlermeldung
und zwar eine Zugriffsverletzung in meiner EXE. Woran könnte das liegen?
  Mit Zitat antworten Zitat
neolithos

Registriert seit: 31. Jul 2003
Ort: Dresden
1.386 Beiträge
 
Delphi 7 Architect
 
#26

Re: Problem mit Nachricht aus DLL

  Alt 7. Jul 2004, 15:51
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.
- ciao neo -
Es gibt niemals dumme Fragen, sondern nur dumme Antworten!
  Mit Zitat antworten Zitat
Chris P

Registriert seit: 8. Mär 2004
230 Beiträge
 
Delphi 7 Enterprise
 
#27

Re: Problem mit Nachricht aus DLL

  Alt 8. Jul 2004, 06:41
@Neolithos

1. Welche Adresse meinst du?

2. An welcher Stelle bekommst du denn die aktuellen Mauskoords in deinem Hook?
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#28

Re: Problem mit Nachricht aus DLL

  Alt 8. Jul 2004, 08:52
Moin!

Zu 1.:
Code:
       SendMessage(hApp, WM_MOUSEHOOK, wparam, Integer(@Mousepos));
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.

MfG
Muetze1
  Mit Zitat antworten Zitat
TStringlist

Registriert seit: 1. Dez 2003
360 Beiträge
 
Turbo Delphi für Win32
 
#29

Re: Problem mit Nachricht aus DLL

  Alt 8. Jul 2004, 15:55
@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
MfG (& Thx ggf.)
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#30

Re: Problem mit Nachricht aus DLL

  Alt 8. Jul 2004, 20:12
Moin!

Zitat von TStringlist:
edit: lp --> lParam / war 'ne eigene Kurzfassung zum schnelleren Austesten
Jo, weil es ja MakeWParam() und MakeLParam() gibt...

MfG
Muetze1
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 4     123 4      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:45 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