![]() |
Maushook
Ich würde gerne einen Maushook programmieren. Dazu habe ich mir mal das Tutorial von Assarbad angeguckt (
![]()
Delphi-Quellcode:
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.
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); 2. Problem: Wie kann ich auswerten, ob eine Maustaste gedrückt wurde oder nicht? |
Der Hook muß in einer DLL liegen, wenn er systemweit sein soll.
Die Maustasten müssten in den Parametern übergeben werden. |
Ich weiß doch! Hab ich auch gemacht! Hook ist auch gestartet.
2. Problem hat sich geklärt: Denkfehler. Thx 1. ist immer noch aktuell. |
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:
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:
if GetAsyncKeyState(VK_LBUTTON) then
showmessage('Die linke taste wurde gedrückt'); if GetAsyncKeyState(VK_RBUTTON) Then showmessage('Die rechte taste wurde gedrückt');
Delphi-Quellcode:
habs jetzt net getestet, müsste aber funktionieren...
...
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; ... |
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.
|
Zitat:
Gruß, Sebastian |
hmm ich kann mir den typ irgenwie nie richtig merken... ja meinte ich auch *g*
|
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:
Kann mir jemand mal bitte diese Lösung erklären?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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:42 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz