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).
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.