Bir Uygulamanın Dışındaki Olayları Yakalamak için Fareyi Bağlayın

Delphi uygulamanız etkin olmasa bile fare etkinliğini nasıl izleyeceğinizi öğrenin. tepsi ya da yapar kullanıcı arayüzü yok hiç.

Sistem çapında (veya global) bir fare kancası takarak, kullanıcının ne yaptığını izleyebilirsiniz. fare ve buna göre hareket edin.

Kanca Nedir ve Nasıl Çalışır?

Kısacası, bir kanca (geri aramak) işlevi bir DLL'in parçası olarak oluşturabilirsiniz (dinamik bağlantı kitaplığı) veya uygulamanızın Windows işletim sistemi içindeki 'devam etmesini' izlemek için kullanabilirsiniz.
Küresel ve yerel olmak üzere 2 tip kanca vardır. Yerel bir kanca yalnızca belirli bir program (veya iş parçacığı) için olanları izler. Global bir kanca tüm sistemi (tüm dişleri) izler.

Global bir kanca oluşturmak için 2 proje, 1 yürütülebilir dosyayı yapmak ve 1 kanca prosedürünü içeren bir DLL yapmak gerekir.

İle ilgili makalemiz Delphi'den klavye kancalarıyla çalışma giriş odağını alamayan kontroller için klavye girişinin nasıl kesileceğini açıklar (TImage gibi).

Fareyi Bağlama

Tasarım gereği, farenin hareketi masaüstü ekranınızın boyutuyla (Windows Görev Çubuğu dahil) sınırlıdır. Fareyi sol / sağ / üst / alt kenara getirdiğinizde, fare beklendiği gibi "duracaktır" - birden fazla monitörünüz yoksa).

instagram viewer

Sistem çapında fare kancası için bir fikir: Örneğin, fareyi ekranın sağ tarafına taşımak istiyorsanız sol kenara doğru hareket ettiğinde (ve "ona dokunduğunda"), fareyi yeniden konumlandırmak için genel bir fare kancası yazabilirsiniz Işaretçi.

Dinamik bir bağlantı kitaplığı projesi oluşturarak işe başlarsınız. DLL iki yöntem vermelidir: "HookMouse" ve "UnHookMouse".

HookMouse prosedürü SetWindowsHookEx İlk parametre için "WH_MOUSE" geçen API - böylece fare mesajlarını izleyen bir kanca prosedürü yükleyin. SetWindowsHookEx parametrelerinden biri, işlenecek bir fare mesajı olduğunda Windows'un arayacağı geri arama işlevinizdir:

SetWindowsHookEx (WH_MOUSE, @HookProc, HInstance, 0);

SetWindowsHookEx içindeki son parametre (değer = 0), genel bir kanca kaydettirdiğimizi tanımlar.

HookProc, fareyle ilgili mesajları ayrıştırır ve test projemize özel bir mesaj ("MouseHookMessage") gönderir:

fonksiyon HookProc (nCode: Tamsayı; MsgID: WParam; Veri: LParam): LResult; stdcall;

var

 mousePoint: TPoint;

 notifyTestForm: boolean;

 MouseDirection: TMouseDirection;

başla

 mousePoint: = PMouseHookStruct (Veri) ^. pt;


 notifyTestForm: = yanlış;


Eğer (MousePoint. X = 0) sonra

başla

 Pencereler. SetCursorPos (-2 + Ekranı). Genişlik, mousePoint.y);

 notifyTestForm: = true;

 Fare Yönü: = mdRight;

son;

...
Eğer notifyTestForm sonra

başla

 PostMessage (FindWindow ('TMainHookTestForm', nil), MouseHookMessage, MsgID, Tamsayı (MouseDirection));

son;

Sonuç: = CallNextHookEx (Kanca, nCode, MsgID, Veri);
son;

İpucu: PMouseHookStruct kaydı ve HookProc işlevinin imzası hakkında bilgi edinmek için Win32 SDK Yardım dosyalarını okuyun.

Not: Bir kanca işlevinin herhangi bir yere bir şey göndermesine gerek yoktur - PostMessage çağrısı yalnızca DLL'nin "dış" dünyayla iletişim kurabildiğini belirtmek için kullanılır.

Fare Kancası "Dinleyici"

"MouseHookMessage" iletisi test projenize gönderilir - "TMainHookTestForm" adlı bir form. İletiyi almak ve gerektiği gibi davranmak için WndProc yöntemini geçersiz kılacaksınız:

prosedür TMainHookTestForm. WndProc (var Mesaj: TMessage);

başla

miras WndProc (Mesaj);

Eğer İleti. Msg = HookCommon. MouseHookMessage sonra

başla

// eşlik eden kodda uygulama bulundu

 Sinyal (TMouseDirection (Mesaj. LParam));

son;

son;

Tabii ki, form oluşturulduğunda (OnCreate) DLL'den HookMouse yordamını çağırırsınız, kapatıldığında (OnDestroy) UnHookMouse yordamını çağırırsınız.

Not: Kancalar sistemi yavaşlatma eğilimindedir, çünkü sistemin her mesaj için gerçekleştirmesi gereken işlem miktarını arttırırlar. Bir kancayı yalnızca gerektiğinde takmalı ve mümkün olan en kısa sürede çıkarmalısınız.