Delphi Can
Fare Hareketi Yakalamak : Mouse.CursorPos.X - Baskı Önizleme

+- Delphi Can (https://www.delphican.com)
+-- Forum: Delphi (https://www.delphican.com/forumdisplay.php?fid=3)
+--- Forum: Genel Programlama (https://www.delphican.com/forumdisplay.php?fid=6)
+--- Konu Başlığı: Fare Hareketi Yakalamak : Mouse.CursorPos.X (/showthread.php?tid=7770)



Fare Hareketi Yakalamak : Mouse.CursorPos.X - bydelphi - 19-06-2024

Merhabalar,

Form da OnMouseMove eventı tetiklenmeden, farenin tüm desktop koordinatını alabilirmiyim.

araştırmalarımda ve testlerimde timer ın intervalı 1 yapılarak 
   
lbMouseX.Caption := InttoStr(  Mouse.CursorPos.X );
lbMouseY.Caption := InttoStr(  Mouse.CursorPos.Y );

bu kodla sürekli canlı alınabiliyor.
ancak timer benim için maliyetli bir çözüm.

bunu timersız,  bir event tetiklenerek yapamaz mıyım ?

Teşekkürler.


Fare Hareketi Yakalamak : Mouse.CursorPos.X - anemos - 20-06-2024

Timer yerine SetWindowLong WinAPI & Subclassing a Window özelliği ile yapabilirsiniz. Dikkatli kullanılması gerekir...

https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-setwindowlonga

https://learn.microsoft.com/en-us/windows/win32/winmsg/using-window-procedures

.


Cvp: Fare Hareketi Yakalamak : Mouse.CursorPos.X - bydelphi - 20-06-2024

(20-06-2024, Saat: 00:46)anemos Adlı Kullanıcıdan Alıntı: Timer yerine SetWindowLong WinAPI & Subclassing a Window özelliği ile yapabilirsiniz. Dikkatli kullanılması gerekir...

https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-setwindowlonga

https://learn.microsoft.com/en-us/windows/win32/winmsg/using-window-procedures

.


Desteğin için teşekkür ederim kardeşim, 
İncelediğimde ve araştırdığımda da bu amaç için nasıl kullanacağımı pek anlayamadım açıkçası. 
anladığım kadarıyla  bu methot belirli bir pencerenin  özelliklerini değiştirmeye yarıyor,
benim ihtiyaç, formdan bağımsız olarak farenin tüm desktop hareketlerini algılamak, sadece formun üzerindeki değil.
biraz daha detay paylaşabilir misiniz.


Cvp: Fare Hareketi Yakalamak : Mouse.CursorPos.X - hi_selamlar - 20-06-2024

(19-06-2024, Saat: 16:49)bydelphi Adlı Kullanıcıdan Alıntı: Merhabalar,

Form da OnMouseMove eventı tetiklenmeden, farenin tüm desktop koordinatını alabilirmiyim.

araştırmalarımda ve testlerimde timer ın intervalı 1 yapılarak 
   
lbMouseX.Caption := InttoStr(  Mouse.CursorPos.X );
lbMouseY.Caption := InttoStr(  Mouse.CursorPos.Y );

bu kodla sürekli canlı alınabiliyor.
ancak timer benim için maliyetli bir çözüm.

bunu timersız,  bir event tetiklenerek yapamaz mıyım ?

Teşekkürler.

Merhabalar,

procedure WMMouseMove(var Msg: TWMMouseMove); message WM_MOUSEMOVE;

API ile denermisiniz lütfen. Umarım yardımcı olur.

Kolay gelsin.


Cvp: Fare Hareketi Yakalamak : Mouse.CursorPos.X - bydelphi - 20-06-2024

(20-06-2024, Saat: 11:13)hi_selamlar Adlı Kullanıcıdan Alıntı:
(19-06-2024, Saat: 16:49)bydelphi Adlı Kullanıcıdan Alıntı: Merhabalar,

Form da OnMouseMove eventı tetiklenmeden, farenin tüm desktop koordinatını alabilirmiyim.

araştırmalarımda ve testlerimde timer ın intervalı 1 yapılarak 
   
lbMouseX.Caption := InttoStr(  Mouse.CursorPos.X );
lbMouseY.Caption := InttoStr(  Mouse.CursorPos.Y );

bu kodla sürekli canlı alınabiliyor.
ancak timer benim için maliyetli bir çözüm.

bunu timersız,  bir event tetiklenerek yapamaz mıyım ?

Teşekkürler.

Merhabalar,

procedure WMMouseMove(var Msg: TWMMouseMove); message WM_MOUSEMOVE;

API ile denermisiniz lütfen. Umarım yardımcı olur.

Kolay gelsin.



Teşekkür ederim dostum ancak sadece form üzerinde algılıyor, form dışı desktop yok, acaba kullanımımda mı sorun var örnekleyebilir misin.

unit Unit1;

interface

uses
 Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
 Vcl.Controls, Vcl.Forms, Vcl.Dialogs;

type
 TForm1 = class(TForm)
   procedure WMMouseMove(var Msg: TWMMouseMove); message WM_MOUSEMOVE;
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.WMMouseMove(var Msg: TWMMouseMove);
begin
  Caption := msg.XPos.ToString  + ' - ' +  msg.YPos.ToString
end;

end.



Cvp: Fare Hareketi Yakalamak : Mouse.CursorPos.X - hi_selamlar - 20-06-2024

(20-06-2024, Saat: 11:48)bydelphi Adlı Kullanıcıdan Alıntı:
(20-06-2024, Saat: 11:13)hi_selamlar Adlı Kullanıcıdan Alıntı: Merhabalar,

procedure WMMouseMove(var Msg: TWMMouseMove); message WM_MOUSEMOVE;

API ile denermisiniz lütfen. Umarım yardımcı olur.

Kolay gelsin.



Teşekkür ederim dostum ancak sadece form üzerinde algılıyor, form dışı desktop yok, acaba kullanımımda mı sorun var örnekleyebilir misin.

unit Unit1;

interface

uses
 Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
 Vcl.Controls, Vcl.Forms, Vcl.Dialogs;

type
 TForm1 = class(TForm)
   procedure WMMouseMove(var Msg: TWMMouseMove); message WM_MOUSEMOVE;
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.WMMouseMove(var Msg: TWMMouseMove);
begin
  Caption := msg.XPos.ToString  + ' - ' +  msg.YPos.ToString
end;

end.

Merhabalar,

[attachment=2725]

[attachment=2727]

Kolay gelsin.


Fare Hareketi Yakalamak : Mouse.CursorPos.X - bydelphi - 20-06-2024

Örnek kod için Çok Teşekkür ederim kardeşim , tam arzu ettiğim gibi


Fare Hareketi Yakalamak : Mouse.CursorPos.X - vedat35 - 23-06-2024

klavyeli versiyonu

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, ExtCtrls, StdCtrls;

type
 TForm1 = class(TForm)
   Memo1: TMemo;
   Memo2: TMemo;
   procedure FormCreate(Sender: TObject);
   procedure FormClose(Sender: TObject; var Action: TCloseAction);
   procedure Timer1Timer(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

Type
 KeybdLLHookStruct = record
   vkCode      : cardinal;
   scanCode    : cardinal;
   flags       : cardinal;
   time        : cardinal;
   dwExtraInfo : cardinal;
 end;
 MouseLLHookStruct = record
   pt          : TPoint;
   mouseData   : cardinal;
   flags       : cardinal;
   time        : cardinal;
   dwExtraInfo : cardinal;
 end;

var
 mHook : cardinal;
 kHook : cardinal;

function LowLevelKeybdHookProc(nCode, wParam, lParam : integer) : integer; stdcall;
// possible wParam values: WM_KEYDOWN, WM_KEYUP, WM_SYSKEYDOWN, WM_SYSKEYUP
var
 info : ^KeybdLLHookStruct absolute lParam;
 lpChar : word;
 kState : TKeyboardState;
begin
result := CallNextHookEx(kHook, nCode, wParam, lParam);
with info^ do
case wParam of
 wm_keydown : begin
   GetKeyboardState(kState);
   if ToAscii(vkCode, scanCode, kState, @lpChar, 0) > 0 then Form1.Memo2.Lines.Append(format('pressed key -- %s', [char(lpChar)]));
 end;
end;
end;

function LowLevelMouseHookProc(nCode, wParam, lParam : integer) : integer; stdcall;
// possible wParam values: WM_LBUTTONDOWN, WM_LBUTTONUP, WM_MOUSEMOVE, WM_MOUSEWHEEL, WM_RBUTTONDOWN, WM_RBUTTONUP
var
 info : ^MouseLLHookStruct absolute lParam;
begin
result := CallNextHookEx(mHook, nCode, wParam, lParam);
with info^ do
case wParam of
 wm_lbuttondown : Form1.Memo1.Lines.Append(format('pressed left button (%d, %d)'    , [pt.x, pt.y]));
 wm_lbuttonup   : Form1.Memo1.Lines.Append(format('released left button (%d, %d)'   , [pt.x, pt.y]));
 wm_mbuttondown : Form1.Memo1.Lines.Append(format('pressed middle button (%d, %d)'  , [pt.x, pt.y]));
 wm_mbuttonup   : Form1.Memo1.Lines.Append(format('released middle button (%d, %d)' , [pt.x, pt.y]));
 wm_rbuttondown : Form1.Memo1.Lines.Append(format('pressed right button (%d, %d)'   , [pt.x, pt.y]));
 wm_rbuttonup   : Form1.Memo1.Lines.Append(format('released right button (%d, %d)'  , [pt.x, pt.y]));
 wm_mousewheel  : begin
   if smallInt(mouseData shr 16) > 0
   then Form1.Memo1.Lines.Append('scrolled wheel (up)')
   else Form1.Memo1.Lines.Append('scrolled wheel (down)');
 end;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
const
 wh_keybd_ll = 13;
 wh_mouse_ll = 14;
 
begin
kHook := SetWindowsHookEx(wh_keybd_ll, @LowLevelKeybdHookProc, hInstance, 0);
mHook := SetWindowsHookEx(wh_mouse_ll, @LowLevelMouseHookProc, hInstance, 0);
end;

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

procedure TForm1.Timer1Timer(Sender: TObject);
begin
form1.caption:='0';
end;

end.



Fare Hareketi Yakalamak : Mouse.CursorPos.X - bydelphi - 24-06-2024

Harika