Autor Beitrag
O'rallY
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 563



BeitragVerfasst: Mi 18.06.03 18:15 
Ich würde gerne einen Maushook programmieren. Dazu habe ich mir mal das Tutorial von Assarbad angeguckt ( www.assarbad.org/stu...als/hooks/index.html ), doch irgendwas stimmt da noch nicht:


Source:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
function MouseHookProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall
begin 
  Result := CallNextHookEx(HookHandle, nCode, wParam, lParam); 
  case nCode < 0 of 
    TRUE: exit; 
    FALSE: 
      begin 
        postMessage(WindowHandle,WM_MOUSEMOVE,wParam,lParam); 
      end
  end
end

//Hook wird gesetzt 
HookHandle := SetWindowsHookEx(WH_MOUSE, @MouseHookProc, hInstance, 0);




1. Problem: Es kommt nur eine Nachricht bei meinem Programm an, wenn ich die Maus auch über mein Programm bewege (ich bin mir noch nicht mal sicher, ob das dann auch ne Message vom Hook ist...). Wenn ich aber ein MessageBox(0, nil, nil, 0) über das PostMessage setze, erscheint auch eine MessageBox (und zwar immer bei bewegen der Maus), allerdings dann unter dem Fittch des aktuellen Programms.

Hook ist in einer DLL und wird von meinem Programm dynamisch eingebunden (übrigrens genau so wie in Assarbads Tutorial).

_________________
.oO'rallY
Linux is like a tipi: No gates, no windows and a gnu-eating apache inside...
Andreas Pfau
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 997



BeitragVerfasst: Mi 18.06.03 19:43 
Hallo,

das kenne ich! Ich habe NULL Ahnung, warum. Das ist zum Mäuse melken. Ich habe mit einigen tricks herausgefunden, dass es anscheinen 2 Instanzen der DLL gibt, so scheint es zumindest, denn die DLL "vergisst" das Fensterhandle, wenn das Ereignis außerhalb des Windows stattfindet.

Daher: Registriere eine Nachricht mit "RegisterwindowMessage()", und sende sie an ALLE Fenster (mit "HWND_BroadCast" als Empfänger-Fenster-Handle). Dann ist aber wichtig, dass dein fenster die Messages mit Application.OnMessage empfeängt, du musst halt die entsprechende Nachricht ruasfiltern, die anderen z.B. mit "Inherited" verarbeiten lassen.

_________________
Life is a bad adventure, but the graphic is really good!
O'rallY Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 563



BeitragVerfasst: Mi 18.06.03 20:30 
Dein Tipp hat auch nicht besser funktioniert. Das gleiche wie vorher: Nur wenn ich mit der Maus über der Form bleibe und sie bewege, kommt die Nachricht an, bzw. wird das OnMessage-Event ausgelöst.

_________________
.oO'rallY
Linux is like a tipi: No gates, no windows and a gnu-eating apache inside...
Andreas Pfau
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 997



BeitragVerfasst: Mi 18.06.03 20:41 
Hallo,

andere Frage: warum setzt du "CallNextHookEx()" an den Anfang des Codes? Diese Prozedur sagt Windows, dass es weitermachen soll, also kommt es NACH der Verabreitung rein.

_________________
Life is a bad adventure, but the graphic is really good!
O'rallY Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 563



BeitragVerfasst: Mi 18.06.03 20:46 
Ja, das habe ich auch schon vermutet und geändert. Hat aber auch nix geholfen. Es ganz zu auskommentieren übrigens auch nicht. :(
Genau so stands aber in Assarbards Tut :-|
Ich bin am verzweifeln!

_________________
.oO'rallY
Linux is like a tipi: No gates, no windows and a gnu-eating apache inside...
Gast
Gast
Erhaltene Danke: 1



BeitragVerfasst: Di 24.06.03 01:06 
Nicht immer alles glauben, ich bin auch nicht unfehlbar :) ... ich werde es korrigieren und dann hier auch kundtun. Es ist ein Fehler im Tut.

Bin übrigens gerade dabei das Hook-Tutorial zu überarbeiten!
O'rallY Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 563



BeitragVerfasst: Di 24.06.03 14:31 
Da ist er ja, der Autor persönlich :wink:.
Habe den Maushook jetzt zum Laufen gebracht, unter Benutzung von File Mapping (wie in Assarbads Tut ja schon angedeutet).
Jetzt habe ich aber noch ein anderes Problem: Wie kann ich verhindern, dass die Messages, die der Hook empfängt, nicht weitergeleitet werden? Eigentlich soll ja ein Hook z.B. Mausnachrichten abfangen und dann sofort weiterleiten (also so, dass keinem Programm "was auffällt"). Aber wie kann ich genau das verhindern?

Das Problem dahinter ist: Ich will auf den Desktop zeichnen. Wenn ich aber die Maustaste gedrückt halte, kommt z.B. das Markierungsviereck oder es wird etwas selektiert, es erscheint ein Popupmenü etc. pp.

_________________
.oO'rallY
Linux is like a tipi: No gates, no windows and a gnu-eating apache inside...
Gast
Gast
Erhaltene Danke: 1



BeitragVerfasst: Di 24.06.03 18:09 
Rufe CallNextHookEx() einfach nicht innerhalb deiner HookProc() auf.

Kann allerdings manchmal auch etwas kritisch sein ... im Zweifelsfall schneidest du damit die Maus-Kommunikation komplett ab!

Nachtrag: Als WH_DEBUG bist du der erste in der Reihe ... sonst kannst du nicht wissen, wo in der Hook-Chain dein Hook ist!
O'rallY Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 563



BeitragVerfasst: Fr 27.06.03 14:00 
Ich habe jetzt einen WH_MOUSE_LL installieren, einen Low Level Mouse Hook. Wenn ich nun das CallNextHookEx auskommentiere, ist überhaupt keine Mauseingabe mehr möglich und die Maus lässt sich auch nicht mehr bewegen. Ok, das hatte ich erwartet.
Doch ich schaffe es nicht, dass man die Maus bewegen kann, aber die Mausklicks nicht mehr erkannt werden. Das heißt, ich will die Mausbewegung durchlassen, nur die Maustastenklicks nicht. Wenn ich die Parameter von CallNextHookEx verändere, lässt es Windows kalt. Die Maus lässt sich ohne einschränkungen bedienen.
Wie lässt sich das Problem lösen?

_________________
.oO'rallY
Linux is like a tipi: No gates, no windows and a gnu-eating apache inside...