Autor Beitrag
Ruditschka
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 66



BeitragVerfasst: Do 15.05.03 13:23 
Hallo zusammen!

Ich habe ein bis zwei Probleme mit meinem Maus-Hook.
Hier erst mal der Code, damit jeder weiß, worum es geht:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
function MouseHookProc(nCode: Integer; wPara: WPARAM; lPara: LPARAM): LRESULT; stdcall;
begin
  Result := CallNextHookEx(HookHandle, nCode, wPara, lPara);
  If nCode = hc_Action then
    begin
    If wPara = WM_LBUTTONDOWN then
      begin
      ShowMessage('Sende Nachricht.......');
      // SendMessage(WindowHandle, WM_MOUSEHOOKMSG, 0, 0);
      PostMessage(WindowHandle, WM_MOUSEHOOKMSG, 00);
      end;
    end;
end;

Die Variable WindowHandle wird beim Starten übergeben und ist Application.Handle meiner Anwendung.

Jetzt meine Probleme:
  1. Der Hook meldet sich bei brav bei jedem Mausklick mit "Sende Nachricht...", soch nur bei einem Klick innerhalb meiner Anwendung kommt auch eine Nachricht bei mir an.
  2. Sobald ich außerhalb meiner Anwendung klicke, wird der Hook direkt 16 mal aktiv.
Hat einer eine Lösung für zumindest eines der Probleme parat?

Gruß
Christoph
djmasi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 54

Win XP Prof. Tablet PC Edition 2005
D7 Enterprise
BeitragVerfasst: Do 15.05.03 13:34 
Wie ich rauslese willst du einen systemweiten MouseHook? dann den Link hier prüfen:
www.experts-exchange...lphi/Q_10472818.html

Wenn Du willst schick ich dir auch das beispiel fertig. hab es gestern es abgetippt. Dauert nämlich etwas 8)
Ruditschka Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 66



BeitragVerfasst: Do 15.05.03 15:01 
Danke für die schnelle Antwort. Anstatt den gesamten Code abzutippen habe ich lediglich die Hook-Prozeduren und die Start/StopWatching Prozeduren rüberkopiert.

Wenn ich den Code aus der Website einbaue, erhalte ich noch wesentlich mehr Fehlermeldung von wegen Fehler an dieser und jener Adresse (wer Interesse daran hat, ich kann die ganzen Adressen mal aufschreiben :wink: ).
Durch ein bischen Fehleranalyse mit try...finally weiß ich jetzt immerhin schon, dass bei dem PostMessage-Befehl ein Fehler auftritt.
Aber welcher :?:
Und wie kann ich den beheben :?:

Wie bereits erwähnt, funktioniert der Hook bei einem Klick innerhalb meiner Anwendung einwandfrei.

Gruß
Christoph
Ruditschka Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 66



BeitragVerfasst: Do 15.05.03 15:04 
Titel: Nachtrag
Noch was:
Wenn ich mit F9 die Ausführung starte (also komplett ohne einen einzigen Mausklick), wird der Hook auch im nächsten Moment 16 mal aktiv.
djmasi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 54

Win XP Prof. Tablet PC Edition 2005
D7 Enterprise
BeitragVerfasst: Do 15.05.03 15:14 
Hast Du eine DLL verwendet oder den Code in Dein Projekt eingebaut? Beschäftige mich erst seit kurzem mit Hooks, aber ich glaube für systemweite Zugriffe macht sich eine DLL am besten.

Ich habe erst das Projekt als ganzes getestet und mir dann die wichtigsten Sachen rausgenommen.
Ruditschka Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 66



BeitragVerfasst: Do 15.05.03 18:36 
Mein Hook sitzt in einer DLL. Aufgrund der Ausgaben, die er testweise macht, weiß ich, dass er systemweit auf jeden Mausklick reagiert. Nur reagiert er meistens 15 mal zu oft und die Nachrichten kommen nicht in meiner Anwendung an.

Gruß
Christoph
Ruditschka Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 66



BeitragVerfasst: Sa 17.05.03 21:06 
Titel: neue Probleme
Ich habe den Hook aus leuter Frust noch einmal von Grund auf neu programmiert. Jetzt läuft er innerhalb meiner Anwendung zu meiner Zufriedenheit. Doch außerhalb meiner Anwendung reagiert er zwar, sendet aber keine Nachrichten an meine Anwendung oder die gesendeten Nachrichten kommen nicht an.

Der Hook sieht in der jetzigen Minimalfunktion so aus:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
const
  MouseMsg = 'MouseHook-Message';

var
  HookHandle : Cardinal = 0;
  ApplicationHandle : Cardinal = 0;
  WM_MOUSEHOOKMSG : Cardinal = 0;

function MouseHookProc(nCode: Integer; wPara: WPARAM; lPara: LPARAM):LRESULT; stdcall;
begin
  case wPara of
    WM_RBUTTONDOWN : PostMessage(ApplicationHandle, WM_MOUSEHOOKMSG, 01);
    WM_LBUTTONDOWN : begin PostMessage(ApplicationHandle, WM_MOUSEHOOKMSG, 02); Beep; end;
    end;
  Result := CallNextHookEx(HookHandle, nCode, wPara, lPara);
end;

function InstallHook(Handle: HWND): Boolean; stdcall;
begin
  Result := false;
  If HookHandle = 0 then
    begin
    HookHandle := SetWindowsHookEx(WH_MOUSE, @MouseHookProc, hInstance, 0);
    ApplicationHandle := Handle;
    ShowMessage(IntToStr(ApplicationHandle));
    WM_MOUSEHOOKMSG := RegisterWindowMessage(MouseMsg);
    Result := true;
    end;
end;

function UninstallHook: Boolean; stdcall;
begin
  Result := UnhookWindowsHookEx(HookHandle);
end;

exports
  InstallHook,
  UninstallHook;
end.


Hat evtl. noch Jemand eine Idee, warum meine Nachrichten nicht immer ankommen?

Gruß
Christoph