AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Wie kann nur der Bereich des Mausklicks auf dem Bildschirm erfasst werden?
Thema durchsuchen
Ansicht
Themen-Optionen

Wie kann nur der Bereich des Mausklicks auf dem Bildschirm erfasst werden?

Ein Thema von flashcoder · begonnen am 29. Mär 2021 · letzter Beitrag vom 30. Mär 2021
 
flashcoder

Registriert seit: 10. Nov 2013
83 Beiträge
 
#6

AW: Wie kann nur der Bereich des Mausklicks auf dem Bildschirm erfasst werden?

  Alt 30. Mär 2021, 09:03
Hey Flashcoder,

Dein Beispiel-GIF zeigt aber auch nicht nur Den oder Den Button sondern nimmt immer ein festes Quadrat von X mal X Pixeln. Ist es wirklich das was Du möchtest oder ist das nur ein nicht ganz optimal gewähltes Beispiel-Gif?
Einen FESTEN Bereich rund um die Mausposition zu kopieren sollte vermutlich nicht so kompliziert umzusetzen sein
Ja, war nicht schwer.

Delphi-Quellcode:
type
  TForm1 = class(TForm)
    Image1: TImage;
    Button1: TButton;
    Button2: TButton;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

type
  PMouseLLHookStruct = ^TMouseLLHookStruct;

  TMouseLLHookStruct = record
    pt: TPoint;
    mouseData: DWORD;
    Flags: DWORD;
    Time: DWORD;
    dwExtraInfo: Cardinal;
  end;

var
  Form1: TForm1;
  mHook: Cardinal;

implementation

{$R *.dfm}

procedure DrawMouseCursor(ScreenShotBitmap: TBitmap);
var
  R: TRect;
  Icon: TIcon;
  II: TIconInfo;
  CI: TCursorInfo;
begin
  R := ScreenShotBitmap.Canvas.ClipRect;
  Icon := TIcon.Create;
  try
    CI.cbSize := SizeOf(CI);
    if GetCursorInfo(CI) then
      if CI.Flags = CURSOR_SHOWING then
      begin
        Icon.Handle := CopyIcon(CI.hCursor);
        if GetIconInfo(Icon.Handle, II) then
        begin
          ScreenShotBitmap.Canvas.Draw(CI.ptScreenPos.X -
            (CI.ptScreenPos.X - Round(Icon.Width / 2)),
            CI.ptScreenPos.Y - (CI.ptScreenPos.Y - Round(Icon.Height /
            2)), Icon);
        end;
      end;
  finally
    Icon.Free;
  end;
end;

function CaptureWindow(const WindowHandle: HWnd): TBitmap;
var
  DC: HDC;
  pt: TPoint;
  Ico: TIcon;
  IcoInfo: TIconInfo;
begin
  DC := GetWindowDC(WindowHandle);
  Result := TBitmap.Create;
  try
    Ico := TIcon.Create;
    try
      Ico.Handle := GetCursor;
      try
        GetIconInfo(Ico.Handle, IcoInfo);
        Result.Width := Ico.Width;
        Result.Height := Ico.Height;
        GetCursorPos(pt);
        BitBlt(Result.Canvas.Handle, 0, 0, Result.Width, Result.Height, DC,
          pt.X - Round(Ico.Width / 2), pt.Y - Round(Ico.Height / 2), SRCCOPY);
        DrawMouseCursor(Result);
      finally
        Ico.ReleaseHandle;
      end;
    finally
      Ico.Free;
    end;
  finally
    ReleaseDC(WindowHandle, DC);
  end;
end;

procedure ScreenShot;
var
  Bmp: TBitmap;
begin
  Bmp := TBitmap.Create;
  try
    Bmp := CaptureWindow(GetDesktopWindow);
    Form1.Image1.Picture.Assign(Bmp);
  finally
    Bmp.Free;
  end;
end;

function LowLevelMouseHookProc(nCode: LongInt; WPARAM: WPARAM; lParam: lParam)
  : LRESULT; stdcall;
var
  info: ^TMouseLLHookStruct absolute lParam;
begin
  Result := CallNextHookEx(mHook, nCode, WPARAM, lParam);

  case WPARAM of
    WM_LBUTTONDOWN:
      begin
        ScreenShot;
        Form1.Label1.Caption := Format('X = %d, Y = %d, LMBtn down',
          [TMouseLLHookStruct(info^).pt.X, TMouseLLHookStruct(info^).pt.Y]);
      end;
    WM_LBUTTONUP:
      Form1.Label1.Caption := Format('X = %d, Y = %d, LMBtn up',
        [TMouseLLHookStruct(info^).pt.X, TMouseLLHookStruct(info^).pt.Y]);
    WM_RBUTTONDOWN:
      Form1.Label1.Caption := Format('X = %d, Y = %d, RMBtn down',
        [TMouseLLHookStruct(info^).pt.X, TMouseLLHookStruct(info^).pt.Y]);
    WM_RBUTTONUP:
      Form1.Label1.Caption := Format('X = %d, Y = %d, RMBtn up',
        [TMouseLLHookStruct(info^).pt.X, TMouseLLHookStruct(info^).pt.Y]);
    WM_MOUSEMOVE:
      Form1.Label1.Caption := Format('X = %d, Y = %d, Move',
        [TMouseLLHookStruct(info^).pt.X, TMouseLLHookStruct(info^).pt.Y]);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  mHook := SetWindowsHookEx(WH_MOUSE_LL, @LowLevelMouseHookProc, HInstance, 0);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  UnhookWindowsHookEx(mHook);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  UnhookWindowsHookEx(mHook);
end;
  Mit Zitat antworten Zitat
 


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 15:06 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 by Thomas Breitkreuz