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 Rechte Maustaste unc CTRL Systemweit abfangen (https://www.delphipraxis.net/37481-rechte-maustaste-unc-ctrl-systemweit-abfangen.html)

yvesdaeschle 6. Jan 2005 12:46


Rechte Maustaste unc CTRL Systemweit abfangen
 
Hallo Zusammen,

ich hab mal wieder ein kleines Problem. Ich habe mir gerade die Geschichte mit den Hooks ein wenig angeschaut, aber ich kommt auf keinen grünen Zweig. Ich kann zwar den Hook installieren und erstellen, aber jetzt kommt meine Frage. Wenn irgendwo (Systemweit) Die Ctrl Taste in Verbindung mit der rechten Mausstaste geklickt wird, dann brauch ich die aktuelle Mausposition.

Wie fang ich Tastatur + Maushook ab und wie bekomme ich dann das Ergebnis in mein Programm (von der DLL).

Bei Assabard war ich schon, versteh das ganze aber nicht ganz.

Danke, Yves

yvesdaeschle 6. Jan 2005 13:46

Re: Rechte Maustaste unc CTRL Systemweit abfangen
 
Hallo,

also das mit den Hooks hab ich doch halbwegs verstanden. Und ich denke auf dem Weg bin ich jetzt schon mal richitg.

Ich habe jetzt versucht, als erstes Mal den Mausdruck zu empfangen. Dazu folgender Code:

Ist in der Hook Dll abgelegt:
Delphi-Quellcode:
function MouseHookProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM):
 LRESULT; stdcall;
begin
//es ist ebenfalls möglich die Bearbeitung an eine Bedingung zu knüpfen
//it's possible to call CallNextHookEx conditional only.
  Result := CallNextHookEx(HookHandle, nCode, wParam, lParam);
  case nCode < 0 of
    TRUE: exit; //wenn code kleiner 0 wird nix gemacht
                //if code smaller 0 nothing has to be done
    FALSE:
      begin
//Hier kann jetzt alles bearbeitet werden
//Here one can work with the parameters
        PostMessage(WindowHandle, WM_MOUSEHOOKMSG, wParam, lParam);
      end;
  end;
end;
In meinem Programm starte ich jetzt den Hook. Und fange die Mausereignisse so ab:
Delphi-Quellcode:
procedure TForm1.DllMessage(var Msg: TMessage);
begin
//  if (Msg.wParam <> WM_LBUTTONDOWN) or (Msg.wParam <> WM_LBUTTONUP) then exit;
  if Msg.wParam = WM_LBUTTONDOWN then
    Label1.Caption := ('Down')
  else if Msg.wParam = WM_LBUTTONUP then
    Label1.Caption := ('Up');
end;
Leider bekomme ich nur die Mausereignisse in meinem eigenen Programm und nicht Systemweit, ich hab doch eine DLL erstellt, ich habe das Gefühl das reicht nicht um es Systemweit zu machen!?

Yves

yvesdaeschle 6. Jan 2005 13:56

Re: Rechte Maustaste unc CTRL Systemweit abfangen
 
Hallo,

hab jetz das Problem gelöst... Bei dem Tutorial von Assabard hab ich das nirgends geshen.

Und zwar mach ich es mit FileMapping, dann funktioniert es Systemweit!

Delphi-Quellcode:
if nCode = HC_ACTION then
  begin
    FileMapObj := OpenFileMapping(FILE_MAP_READ, False,'CSHookMapFile');
    if FileMapObj <> 0 then
    begin
      FileMapView := MapViewOfFile(FileMapObj, FILE_MAP_READ, 0, 0, 0);
      PostMessage(FileMapView^, WM_MOUSEHOOKMSG, wParam, lParam);
      UnmapViewOfFile(FileMapView);
      CloseHandle(FileMapObj);
    end;
    Result := CallNextHookEx(HookHandle, nCode, wParam, lParam);
  end;
Warum geht das nur so?

Yves


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