Bu makale makine çevirisi ayna makalesidir, orijinal makaleye geçmek için lütfen buraya tıklayın.

Görünüm: 17250|Yanıt: 0

[İpucu] C# programlama becerilerinde kanca fonksiyonlarının kullanımı - SetWindowsHookEx

[Bağlantıyı kopyala]
Yayınlandı 7.02.2019 21:12:59 | | |
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.





Önceki:Saf C# hook uygulaması
Önümüzdeki:【Jiangshi WeChat Multi-Open】WeChat Scan Code Optional Login|Unlimited Multi-Open|Save Login Configuration
Feragatname:
Code Farmer Network tarafından yayımlanan tüm yazılım, programlama materyalleri veya makaleler yalnızca öğrenme ve araştırma amaçları içindir; Yukarıdaki içerik ticari veya yasa dışı amaçlarla kullanılamaz, aksi takdirde kullanıcılar tüm sonuçları ödemelidir. Bu sitedeki bilgiler internetten alınmakta olup, telif hakkı anlaşmazlıklarının bu siteyle hiçbir ilgisi yoktur. Yukarıdaki içeriği indirmeden sonraki 24 saat içinde bilgisayarınızdan tamamen silmelisiniz. Programı beğendiyseniz, lütfen orijinal yazılımı destekleyin, kayıt satın alın ve daha iyi orijinal hizmetler alın. Herhangi bir ihlal olursa, lütfen bizimle e-posta yoluyla iletişime geçin.

Mail To:help@itsvse.com