Pelajari cara melacak aktivitas mouse bahkan ketika aplikasi Delphi Anda tidak aktif, duduk di jendela baki atau tidak tidak memiliki UI apa pun sama sekali.
Dengan memasang kait mouse di seluruh sistem (atau global), Anda dapat memantau apa yang dilakukan pengguna dengan mouse dan bertindak sesuai itu.
Apa itu Pengait dan Bagaimana Cara Kerjanya?
Singkatnya, sebuah kail adalah (panggilan balik) fungsi yang dapat Anda buat sebagai bagian dari DLL (perpustakaan tautan dinamis) atau aplikasi Anda untuk memantau 'kejadian' di dalam sistem operasi Windows.
Ada 2 jenis kait - global dan lokal. Sebuah kait lokal memantau hal-hal yang terjadi hanya untuk program tertentu (atau utas). Hook global memonitor seluruh sistem (semua utas).
Untuk membuat hook global Anda membutuhkan 2 proyek, 1 untuk membuat file yang dapat dieksekusi dan 1 untuk membuat DLL yang berisi prosedur hook.
Artikel kami di bekerja dengan pengait keyboard dari Delphi menjelaskan cara mencegat input keyboard untuk kontrol yang tidak dapat menerima fokus input (seperti TImage).
Mengaitkan Mouse
Secara desain, pergerakan mouse dibatasi oleh ukuran layar desktop Anda (termasuk Windows Task Bar). Ketika Anda menggerakkan mouse ke tepi kiri / kanan / atas / bawah, mouse akan "berhenti" - seperti yang diharapkan (jika Anda tidak memiliki lebih dari satu monitor).
Berikut adalah ide untuk kait mouse di seluruh sistem: Jika misalnya, Anda ingin memindahkan mouse ke sisi kanan layar ketika bergerak ke arah tepi kiri (dan "menyentuhnya"), Anda dapat menulis hook global mouse untuk memposisikan ulang mouse penunjuk.
Anda mulai dengan membuat proyek perpustakaan tautan dinamis. DLL harus mengekspor dua metode: "HookMouse" dan "UnHookMouse".
Prosedur HookMouse memanggil SetWindowsHookEx API yang meneruskan "WH_MOUSE" untuk parameter pertama - dengan demikian memasang prosedur kait yang memonitor pesan mouse. Salah satu parameter untuk SetWindowsHookEx adalah fungsi callback Anda Windows akan memanggil ketika ada pesan mouse untuk diproses:
SetWindowsHookEx (WH_MOUSE, @HookProc, HInstance, 0);
Parameter terakhir (nilai = 0) di SetWindowsHookEx mendefinisikan kita sedang mendaftarkan hook global.
HookProc mem-parsing pesan terkait mouse dan mengirim pesan khusus ("MouseHookMessage") ke proyek pengujian kami:
fungsi HookProc (nCode: Integer; MsgID: WParam; Data: LParam): LResult; stdcall;
var
mousePoint: TPoint;
notifyTestForm: boolean;
MouseDirection: TMouseDirection;
mulai
mousePoint: = PMouseHookStruct (Data) ^. pt;
notifyTestForm: = false;
jika (mousePoint. X = 0) kemudian
mulai
Windows. SetCursorPos (-2 + Layar. Lebar, mousePoint.y);
notifyTestForm: = true;
MouseDirection: = mdRight;
akhir;
...
jika notifyTestForm kemudian
mulai
PostMessage (FindWindow ('TMainHookTestForm', nil), MouseHookMessage, MsgID, Integer (MouseDirection));
akhir;
Hasil: = CallNextHookEx (Hook, nCode, MsgID, Data);
akhir;
Tip: Baca file Bantuan Win32 SDK untuk mencari tahu tentang catatan PMouseHookStruct dan tanda tangan dari fungsi HookProc.
Catatan: Fungsi kait tidak perlu mengirim apa pun ke mana pun - panggilan PostMessage hanya digunakan untuk menunjukkan bahwa DLL dapat berkomunikasi dengan dunia "luar".
Mouse Hook "Pendengar"
Pesan "MouseHookMessage" diposting ke proyek pengujian Anda - formulir bernama "TMainHookTestForm". Anda akan mengganti metode WndProc untuk mendapatkan pesan dan bertindak sesuai kebutuhan:
prosedur TMainHookTestForm. WndProc (var Pesan: TMessage);
mulai
mewarisi WndProc (Pesan);
jika Pesan. Msg = HookCommon. MouseHookMessage kemudian
mulai
// implementasi ditemukan dalam kode terlampir
Sinyal (TMouseDirection (Pesan. LParam));
akhir;
akhir;
Tentu saja, ketika formulir dibuat (OnCreate) Anda memanggil prosedur HookMouse dari DLL, ketika sudah ditutup (OnDestroy) Anda memanggil prosedur UnHookMouse.
Catatan: Hook cenderung memperlambat sistem karena meningkatkan jumlah pemrosesan yang harus dilakukan sistem untuk setiap pesan. Anda harus memasang kait hanya jika perlu, dan lepaskan kaitnya sesegera mungkin.