Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Maushook (https://www.delphipraxis.net/5771-maushook.html)

OrallY 18. Jun 2003 17:08


Maushook
 
Ich würde gerne einen Maushook programmieren. Dazu habe ich mir mal das Tutorial von Assarbad angeguckt ( http://www.assarbad.org/stuff/tutori...oks/index.html ), doch irgendwas stimmt da noch nicht:

Delphi-Quellcode:
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.
2. Problem: Wie kann ich auswerten, ob eine Maustaste gedrückt wurde oder nicht?

Luckie 18. Jun 2003 17:10

Der Hook muß in einer DLL liegen, wenn er systemweit sein soll.

Die Maustasten müssten in den Parametern übergeben werden.

OrallY 18. Jun 2003 17:12

Ich weiß doch! Hab ich auch gemacht! Hook ist auch gestartet.
2. Problem hat sich geklärt: Denkfehler. Thx
1. ist immer noch aktuell.

Basic-Master 18. Jun 2003 17:21

hi,
zu deinem 2. problem könnte ich dir helfen: mach n timer, da stellste das interval auf 50 und in dem timer-event kannste das hier reinnehmen:
Delphi-Quellcode:
if GetAsyncKeyState(VK_LBUTTON) then
showmessage('Die linke taste wurde gedrückt');
if GetAsyncKeyState(VK_RBUTTON) Then
showmessage('Die rechte taste wurde gedrückt');
wenn du dann auch noch überprüfen willst, ob die maus sich bewegt hat, kannste das ja mit ner pointer-variable machen. da kannste dir die mausposition per getcursorpos holen und immer vergleichen:
Delphi-Quellcode:
...
public LastPos:Pointer;
...
procedure TForm1.Timer1Timer(Sender:TObject);
var NewPos:pointer;
begin
...
getcursorpos(newpos);
if lastpos <> newpos then begin
showmessage('Die maus wurde bewegt');
lastpos := newpos;
end;
end;
...
habs jetzt net getestet, müsste aber funktionieren...

OrallY 18. Jun 2003 17:28

Ein Mousehook ist aber genau dazu da, das zu machen, was du in deiner Lösung ausgedrückt hast. Außerdem hat ein Hook noch weitere Vorteile, die dein Code nicht bieten kann. Trotzdem danke.

Sebastian Nintemann 18. Jun 2003 19:09

Zitat:

Zitat von Basic-Master
Delphi-Quellcode:
var NewPos:pointer;

Meinst du nicht TPoint?

Gruß, Sebastian

Basic-Master 18. Jun 2003 20:46

hmm ich kann mir den typ irgenwie nie richtig merken... ja meinte ich auch *g*

OrallY 19. Jun 2003 16:02

Ich habe mein Problem jetzt lösen können, doch richtig verstehen tue ich sie nicht. Es werden file mapped objects benutzt (was auch immer das ist):
Delphi-Quellcode:

const
  WM_HOOKMAP = WM_USER + $1000;
//der wichtigste Teil der DLL
function MouseHookProc(Code: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
  if code = HC_ACTION then
  begin
    FileMapObj := OpenFileMapping(FILE_MAP_READ, False,'HookMapFile');
    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;
  Result := CallNextHookEx(HookHandle, Code, wParam, lParam);
end;

//und des Programms

FileMapObj: THandle;
FileMapView: ^Integer;

//***************************************

  FileMapObj := CreateFileMapping( $FFFFFFFF, nil, PAGE_READWRITE, 0, SizeOf(Integer), 'HookMapFile');

  if FileMapObj = 0 then
    raise Exception.Create( 'Error while creating file.');

  FileMapView := MapViewOfFile(FileMapObj, FILE_MAP_WRITE, 0, 0, 0);

  FileMapView^ := Self.Handle;
Kann mir jemand mal bitte diese Lösung erklären?


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:27 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