AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Maushook

Ein Thema von OrallY · begonnen am 18. Jun 2003 · letzter Beitrag vom 19. Jun 2003
Antwort Antwort
Benutzerbild von OrallY
OrallY

Registriert seit: 29. Apr 2003
268 Beiträge
 
#1

Maushook

  Alt 18. Jun 2003, 17:08
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?
.oO'rallY
Linux is like a tipi: no gates, no windows and a gnu-eating apache inside...
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2
  Alt 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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von OrallY
OrallY

Registriert seit: 29. Apr 2003
268 Beiträge
 
#3
  Alt 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.
.oO'rallY
Linux is like a tipi: no gates, no windows and a gnu-eating apache inside...
  Mit Zitat antworten Zitat
Basic-Master

Registriert seit: 9. Mär 2003
Ort: Brilon
395 Beiträge
 
Delphi 2007 Enterprise
 
#4
  Alt 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...
Christian
  Mit Zitat antworten Zitat
Benutzerbild von OrallY
OrallY

Registriert seit: 29. Apr 2003
268 Beiträge
 
#5
  Alt 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.
.oO'rallY
Linux is like a tipi: no gates, no windows and a gnu-eating apache inside...
  Mit Zitat antworten Zitat
Sebastian Nintemann
(Gast)

n/a Beiträge
 
#6
  Alt 18. Jun 2003, 19:09
Zitat von Basic-Master:
var NewPos:pointer;
Meinst du nicht TPoint?

Gruß, Sebastian
  Mit Zitat antworten Zitat
Basic-Master

Registriert seit: 9. Mär 2003
Ort: Brilon
395 Beiträge
 
Delphi 2007 Enterprise
 
#7
  Alt 18. Jun 2003, 20:46
hmm ich kann mir den typ irgenwie nie richtig merken... ja meinte ich auch *g*
Christian
  Mit Zitat antworten Zitat
Benutzerbild von OrallY
OrallY

Registriert seit: 29. Apr 2003
268 Beiträge
 
#8
  Alt 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?
.oO'rallY
Linux is like a tipi: no gates, no windows and a gnu-eating apache inside...
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:23 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