Bildiğiniz gibi: C#, .NET Framework platformuna eşlik eden bir dil ve kendi kütüphaneleri ve derleyici içerikleriyle küresel hooklar uygulamak mümkün değildir. Ancak pratikte yönetilmeyen koda yapılan çağrılar C#'da geçerlidir; DllImport özelliği kullanılarak yönetilmeyen kod kütüphanesindeki metodlara referans verilir. Kanca fonksiyonları user32.dll'de mevcuttur ve fonksiyon prototipi şöyledir:
HHOOK WINAPI SetWindowsHookEx(
__in int idHook,
__in HOOKPROC lpfn,
__in HINSTANCE hMod,
__in DWORD dwThreadId);
Bu yöntem, işletim sistemine (Windows) belirli bir mesaj yakalama işleme yöntemini kaydetmek için kullanılabilir; örneğin, küresel klavye mesajlarını engellemek için bir kanca kaydedebiliriz, böylece tüm klavye baskı ve kaldırma olayları bizim tarafımızdan algılanabilir ve işlenebilir (mesajı bırakmak için ön uç bir kancası olması da göz önüne alınmaz).
Bu fonksiyonu C#'da şöyle belirterek referans verebiliriz:
[DllImport("user32.dll")] public static extern int SetWindowsHookEx( HookType idHook, HookProc lpfn, IntPtr hInstance, int threadId );
Yukarıdaki HookType ve HookProc'un benim özel tiplerim olduğunu belirtmekte fayda var, bu önemli değil (çünkü program çalışırken bir bellek adresi gönderir), ancak belirli spesifikasyonlara uyması gerekir.
Fonksiyonun yukarıdan aşağıya parametreleri şunlardır:
idHook türü, burada şekilli bir enum ile temsil edilir LPFN geri dönüş fonksiyonu hooklar devreye girdiğinde uygulama örneğinin hInstance modülü tutamacı (genellikle hook callback fonksiyonunuzun bulunduğu uygulama örneğinin modül tutucu) threadIdKurulu hook alt programıyla ilişkili iş parçacığının tanımlayıcısı
Birkaç kanca türü vardır:
Genellikle klavye mesajlarını engellemek için 13, fare mesajlarını engellemek için ise 14 kullanıyoruz.
Geri çağırma fonksiyonunun bildirilmesi C# ile delegeler kullanmamız gerekiyor ve bildirme şu şekildedir: public delegate int HookProc(int nCode, int wParam, IntPtr lParam);
Yukarıdan aşağıya parametre, parametrenin nCode hook zincirinden geri gönderildiğini, 0 bu mesajın (önceki mesaj kancası tarafından) atıldığını ve 0 olmayan parametrenin bu mesajın geçerli olmaya devam ettiğini gösterir
wParam mesaj parametreleri
lParam mesaj parametresi
wParam ve lParam'ın farklı mesaj türlerinin farklı türleri olduğunu belirtmekte fayda var, ancak wParam türleri kabaca aşağıdaki listeleme ile temsil edilebilir:
lParam genellikle mesaj türüne göre değişen bir yapı olarak kapsüllenir; aşağıdaki iki yapı fare ve klavye mesajlarının lParam yapısıdır:
Yukarıdaki bilgileri anladığımızda, kanca fonksiyonlarının C# uygulamasını temel olarak anlarız ve ardından birkaç soruya dikkat ederiz:
1. Hooklar çok fazla kaynak kaplar ve kullanılmadığında zamanında iptal edilmelidir; bu da UnhookWindowsHookEx fonksiyonunun kullanılmasını gerektirir
2. Nezaket gereği, hook sadece mevcut hook'un işlem sonucunu değil, bir sonraki hook'un işlem sonucunu döndürmelidir (bir sonraki hook'u çağırmak için CallNextHookEx kullanın, çünkü hook önce ayarlanır ve sonra etkisi olur, bu yüzden hook zincirinin normal teslimatını sağlamak için yapılmalıdır).
3. Hook fonksiyonu parametresindeki hInstance, yalnızca mevcut hook'un geri çağırma fonksiyonu olduğu yerdir ve doğru adres verilmelidir
4. Delege kullanıldığı için, delegenin bellek adresinin (yönteme referans) çöpe gitmediğinden emin olmalıdır, aksi takdirde hook çalıştırıldığında bir istisna olur
Yazdığım örnek programı indirebilirsiniz, ancak benim programım şu ana noktalara ihtiyaç duyuyor:
1. Hookların uygulanmasını engelledim ve sadece mesaj yakalama ve klavye ile farenin işleme bölümünü açtım (kullanım yöntemi C#'ın WinForm fare ve klavye olaylarıyla aynıdır), başka yöntemleri de açabiliyorsunuz
2. Kancayı singleton modunda tasarladım, iptal edebilirsiniz
3. İşletim sistemine belirli bir müdahale nedeniyle, antivirüs yazılımı riskli olarak bildirilebilir
4. Kod kötü yazılmış, sadece bununla idare et......
Son olarak, programlama teknolojisi ile dil arasındaki fark, derleyicileri ile kullanıcılarının farklı olmasıdır; C kullananların Java kullananlardan daha yüksek olduğu söylenemez ve teknoloji mutlaka işaretçilerde, matrislerde, veri yapılarında yansıtılmaz; yeter ki bilgisayar ilkelerini, derleme ilkelerini, işletim sistemi prensiplerini vb. anlayanlar olsun. Elbette, herkesin kendi favori dili ve alışılmış programlama yöntemleri olması iyi.
|