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



BeitragVerfasst: So 21.12.03 19:38 
Ich habe einen Maushook installiert der meinem Programm eine Nachricht schickt, wenn die sich die Maus bewegt. Der Hook verhindert auch, dass andere Programme noch eine Mausnachricht empfangen können (Grund: ich will auf den Desktop zeichnen).
Das klappt auch alles Wunderbar bei ungedrückter Maustaste. Doch wenn ich in irgendeinem Fenster eine Maustaste drücke und gedrückt halte, wird meinem Programm nur noch so lange eine Nachricht gescickt, wie die Maus sich über diesem Fenster befindet. Wenn sie über die Fenstergrenze hinausbewegt wird, kommt bei meinem Prog nix mehr an, erst wieder, wenn sie sich wieder über dem Fenster befindet.

Woran liegt das, und wie kann ich das beheben?

Der Maushook:

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:
40:
41:
42:
43:
44:
45:
46:
47:
library mousehook;

uses
  Windows,
  Messages;

const
  WM_HOOKMAP = WM_USER + $0400;

var
  HookHandle    : HHook;
  FileMapObj    : THandle;
  FileMapView   : ^Integer;

function MouseHookProc(Code: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
  if code = HC_ACTION then
  begin
    FileMapObj := OpenFileMapping(FILE_MAP_READ, False,'MouseHookMapFile');
    if FileMapObj <> 0 then
    begin
      FileMapView := MapViewOfFile(FileMapObj, FILE_MAP_READ, 0, 0, 0);
      PostMessage(FileMapView^, WM_HOOKMAP, wParam, lParam);
      UnmapViewOfFile(FileMapView);
      CloseHandle(FileMapObj);
    end;
  end;
  {Das Auskommentieren sorgt dafür, dass niemand anderes Mausnachrichten bekommen kann (ich weiß, ist vielleicht nicht das sauberste, aber es funktioniert wenigstens)}
  //Result := CallNextHookEx(HookHandle, Code, wParam, lParam);
end;

procedure InstallMouseHook; stdcall;
begin
  HookHandle := SetWindowsHookEx(WH_MOUSE, @MouseHookProc, hInstance , 0);
end;

procedure UninstallMouseHook; stdcall;
begin
  UnhookWindowsHookEx(HookHandle);
end;

exports
InstallMouseHook,
UninstallMouseHook;

begin
end.

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



BeitragVerfasst: So 21.12.03 21:47 
Ich habe gerade mal ein bissl rumprobiert:
Ist zwar nicht ganz sauber, aber es funktioniert einigermaßen.

In OnCreate von deinem Formular:

ausblenden Delphi-Quelltext
1:
 align := alclient;					


Dann musst du noch einen Messagehandler für WM_ERASEBKGND schreiben:

ausblenden Delphi-Quelltext
1:
2:
  private
    procedure WMEraseBkgnd(var Message: TWMEraseBkgnd); message WM_ERASEBKGND;


und

ausblenden Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.WMERASEBKGND(var message: TWMEraseBkgnd);
begin
 ;
end;


Jetzt ist das Formular aber zwangsläufig unsichtbar und es werden sowieso alle Nachrichten von dem Formular abgefangen.
Das mit dem Messagehandler kannst du auch durch Brush.Style := bsclear ersetzen...
O'rallY Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 563



BeitragVerfasst: Mo 22.12.03 13:25 
Geniale Idee! Einfach, genial. Dankeschön! Warum schwer, wenns auch einfach geht :mrgreen:.

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