Aracılığıyla paylaş


Kancalara Genel Bakış

kanca, bir uygulamanın iletiler, fare eylemleri ve tuş vuruşları gibi olayları kesebildiği bir mekanizmadır. Belirli bir olay türünü kesen bir işlev, bir kanca yordamıolarak bilinir. Kanca prosedürü aldığı her olay üzerinde işlem yapabilir ve ardından olayı değiştirebilir veya yok sayabilir.

Kancaların bazı örnek kullanımları:

  • Hata ayıklama amacıyla iletileri izleme
  • Makroların kaydedilmesi ve çalıştırılması için destek sağlama
  • Yardım anahtarı için destek sağlama (F1)
  • Fare ve klavye girdisini simüle et.
  • Bilgisayar tabanlı eğitim (CBT) uygulaması uygulama

Not

Kancalar, sistemin her ileti için gerçekleştirmesi gereken işleme miktarını artırdığından sistemi yavaşlatma eğilimindedir. Bir kancayı yalnızca gerektiğinde yüklemeniz ve en kısa sürede kaldırmanız gerekir.

 

Bu bölümde aşağıdakiler ele alınmaktadır:

Kanca Zincirleri

Sistem birçok farklı kanca türünü destekler; her tür, ileti işleme mekanizmasının farklı bir yönüne erişim sağlar. Örneğin, bir uygulama fare iletileri için ileti trafiğini izlemek için WH_MOUSE kancasını kullanabilir.

Sistem, her kanca türü için ayrı bir kanca zinciri tutar. kanca zinciri, kanca yordamlarıadlı özel, uygulama tanımlı geri çağırma işlevlerinin işaretçilerinin listesidir. Belirli bir kanca türüyle ilişkili bir ileti oluştuğunda, sistem iletiyi kanca zincirinde söz konusu olan her kanca yordamına birer birer geçirir. Bir kanca prosedürünün gerçekleştirebileceği eylem, ilgili kancanın türüne bağlıdır. Bazı kanca türleri için kanca yordamları yalnızca iletileri izleyebilir; diğer kişiler iletileri değiştirebilir veya zincir üzerinden ilerlemelerini durdurarak bir sonraki kanca yordamına veya hedef pencereye ulaşmalarını engelleyebilir.

Kanca İşlemleri

Belirli bir kanca türünden yararlanmak için geliştirici bir kanca yordamı sağlar ve kancayla ilişkili zincire eklemek için SetWindowsHookEx işlevini kullanır. Bir kanca prosedürü aşağıdaki söz dizimine sahip olmalıdır:

LRESULT CALLBACK HookProc(
  int nCode, 
  WPARAM wParam, 
  LPARAM lParam
)
{
   // process event
   ...

   return CallNextHookEx(NULL, nCode, wParam, lParam);
}

HookProc, uygulama tanımlı bir ad için yer tutucudur.

nCode parametresi, kanca yordamının gerçekleştirilecek eylemi belirlemek için kullandığı bir kanca kodudur. Kanca kodunun değeri kancanın türüne bağlıdır; her türün kendi özellik kümesi kanca kodları vardır. wParam ve lParam parametrelerinin değerleri kanca koduna bağlıdır, ancak genellikle gönderilen veya yayımlanan bir ileti hakkında bilgi içerir.

SetWindowsHookEx işlevi her zaman bir hook zincirinin başına bir hook yordamı yükler. Belirli bir kanca türü tarafından izlenen bir olay meydana geldiğinde, sistem bu kancayla ilişkili kanca zincirinin başındaki işlevi çağırır. Zincirdeki her kanca yordamı, olayın sonraki yordama geçirilip geçirileceğini belirler. Kanca prosedürü, bir olayı sonraki prosedüre geçirebilmek için CallNextHookEx işlevini çağırır.

Bazı kanca türleri için kanca yordamlarının yalnızca iletileri izleyebildiğini unutmayın. Sistem, belirli bir kanca yordamının CallNextHookEx çağırıp çağırmadığına bakılmaksızın iletileri her kanca yordamına geçirir.

genel kanca, çağrı iş parçacığıyla aynı masaüstündeki tüm iş parçacıkları için iletileri izler. iş parçacığına özgü kanca iletileri yalnızca tek bir iş parçacığı için izler. Genel bir kanca yordamı, çağıran iş parçacığıyla aynı masaüstündeki herhangi bir uygulama bağlamında çağrılabilir, bu nedenle yordamın ayrı bir DLL modülünde olması gerekir. İş parçacığına özgü bir kanca mekanizması yalnızca ilişkili iş parçacığı bağlamında çağrılır. Bir uygulama kendi iş parçacıklarından biri için bir kanca yordamı yüklerse, kanca yordamı uygulamanın kodunun geri kalanıyla aynı modülde veya DLL'de olabilir. Uygulama farklı bir uygulamanın iş parçacığı için bir kanca yordamı yüklerse, yordamın bir DLL içinde olması gerekir. Bilgi için bkz. Dynamic-Link Kitaplıkları.

Not

Genel kancaları yalnızca hata ayıklama amacıyla kullanmalısınız; aksi takdirde, bunlardan kaçınmalısınız. Genel kancalar sistem performansına zarar verir ve aynı genel kanca türünü uygulayan diğer uygulamalarla çakışmalara neden olur.

 

Kanca Türleri

Her kanca türü, bir uygulamanın sistemin ileti işleme mekanizmasının farklı bir yönünü izlemesini sağlar. Aşağıdaki bölümlerde kullanılabilir kancalar açıklanmaktadır.

WH_CALLWNDPROC ve WH_CALLWNDPROCRET

WH_CALLWNDPROC ve WH_CALLWNDPROCRET kancaları, pencere yordamlarına gönderilen iletileri izlemenizi sağlar. Sistem, iletiyi alıcı pencere yordamına geçirmeden önce WH_CALLWNDPROC kanca yordamını çağırır ve pencere yordamı iletiyi işledikten sonra WH_CALLWNDPROCRET kanca yordamını çağırır.

WH_CALLWNDPROCRET kancası, kanca prosedürüne bir CWPRETSTRUCT yapısının bir işaretçisini geçirir. Yapısı, iletiyi işleyen pencere yordamından döndürülen değerin yanı sıra iletiyle ilişkili ileti parametrelerini içerir. Pencerenin alt sınıflanması, işlemler arasında ayarlanan iletiler için çalışmaz.

Daha fazla bilgi için, CallWndProc ve CallWndRetProc geri çağırma işlevlerine bakın.

WH_CBT

Sistem bir pencereyi etkinleştirmeden, oluşturmadan, yok etmeden, en aza indirmeden, en üst düzeye çıkarmadan, taşımadan veya boyutlandırmadan önce bir WH_CBT kanca yordamı çağırır; bir sistem komutunu tamamlamadan önce; sistem ileti kuyruğundan fare veya klavye olayını kaldırmadan önce; giriş odağını ayarlamadan önce; veya sistem ileti kuyruğuyla eşitlemeden önce. Kanca yordamının döndürdüğü değer, sistemin bu işlemlerden birine izin verip vermeyeceğini veya bunları engelleyip engellemediğini belirler. WH_CBT kancası öncelikle bilgisayar tabanlı eğitim (CBT) uygulamalarına yöneliktir.

Daha fazla bilgi için CBTProcgeri çağırma işlevinebakın.

Bilgi için bkz. WinEvents.

WH_DEBUG

Sistem, sistemdeki diğer kancalarla ilişkili kanca yordamlarını çağırmadan önce bir WH_DEBUG kanca yordamı çağırır. Sistemin diğer kanca türleriyle ilişkili kanca yordamlarını çağırmasına izin verilip verilmeyeceğini belirlemek için bu kancayı kullanabilirsiniz.

Daha fazla bilgi için DebugProc geri çağırma işlevine bakın.

WH_FOREGROUNDIDLE

WH_FOREGROUNDIDLE kancası, ön plan iş parçacığının boşta olduğu zamanlarda düşük öncelikli işlemleri yürütmenizi sağlar. Uygulamanın ön plan iş parçacığı boşta kalmak üzereyken sistem bir WH_FOREGROUNDIDLE kanca yordamı çağırır.

Daha fazla bilgi için ForegroundIdleProc geri çağırma işlevi'e bakın.

WH_GETMESSAGE

WH_GETMESSAGE kancası, bir uygulamanın GetMessage veya PeekMessage işlevi tarafından döndürülmek üzere olan iletileri izlemesine olanak tanır. fare ve klavye girişini ve ileti kuyruğuna gönderilen diğer iletileri izlemek için WH_GETMESSAGE kancasını kullanabilirsiniz.

Daha fazla bilgi için, GetMsgProc geri çağırma işlevine bakın.

WH_JOURNALPLAYBACK

Uyarı

Günlük Kancaları API'leri Windows 11'den itibaren desteklenmez ve gelecek bir sürümde kaldırılacaktır. Bu nedenle, bunun yerine SendInput TextInput API'sini çağırmanızı kesinlikle öneririz.

WH_JOURNALPLAYBACK kancası, bir uygulamanın sistem ileti kuyruğuna ileti eklemesini sağlar. Bu kancayı, WH_JOURNALRECORDkullanarak daha önce kaydedilmiş bir dizi fare ve klavye olayını oynatmak için kullanabilirsiniz. WH_JOURNALPLAYBACK kancası yüklü olduğu sürece normal fare ve klavye girişi devre dışı bırakılır. WH_JOURNALPLAYBACK kancası genel bir kancadır; bu nedenle iş parçacığına özgü bir kanca olarak kullanılamaz.

WH_JOURNALPLAYBACK kancası bir zaman aşımı değeri döndürür. Bu değer, sistemin oynatma kancasından gelen mevcut mesajı işlemeye başlamadan önce kaç milisaniye beklemesi gerektiğini belirtir. Bu, hook fonksiyonunun çaldığı olayların zamanlamasını kontrol etmesini sağlar.

Daha fazla bilgi için bkz. JournalPlaybackProc geri çağırma işlevi.

WH_JOURNALRECORD

Uyarı

Günlük Kancaları API'leri Windows 11'den itibaren desteklenmez ve gelecek bir sürümde kaldırılacaktır. Bu nedenle, bunun yerine SendInput TextInput API'sini çağırmanızı kesinlikle öneririz.

WH_JOURNALRECORD kancası, giriş olaylarını izlemenizi ve kaydetmenizi sağlar. Genellikle bu kancayı, WH_JOURNALPLAYBACKkullanarak daha sonra yürütülecek bir dizi fare ve klavye olayını kaydetmek için kullanırsınız. WH_JOURNALRECORD kancası genel bir kancadır; iş parçacığına özgü bir kanca olarak kullanılamaz.

Daha fazla bilgi için bkz. JournalRecordProc geri çağırma işlevi.

WH_KEYBOARD_LL

WH_KEYBOARD_LL kancası, iş parçacığı giriş kuyruğuna gönderilmek üzere olan klavye giriş olaylarını izlemenizi sağlar.

Daha fazla bilgi için bkz. LowLevelKeyboardProc geri çağırma işlevi.

WH_KEYBOARD

WH_KEYBOARD kancası, uygulamanın mesaj trafiğini, GetMessage veya PeekMessage işlevi tarafından döndürülmek üzere olan WM_KEYDOWN ve WM_KEYUP iletilerini izlemesini sağlar. bir ileti kuyruğuna gönderilen klavye girişini izlemek için WH_KEYBOARD kancasını kullanabilirsiniz.

Daha fazla bilgi için bkz. KeyboardProc geri çağırma işlevi.

WH_MOUSE_LL

WH_MOUSE_LL kancası, bir iş parçacığı giriş kuyruğuna gönderilecek olan fare giriş olaylarını izlemenizi sağlar.

Daha fazla bilgi için bkz: LowLevelMouseProc geri çağırma fonksiyonu.

WH_MOUSE

WH_MOUSE kancası, GetMessage veya PeekMessage işlevi tarafından döndürülmek üzere olan fare iletilerini izlemenizi sağlar. Bir ileti kuyruğuna gönderilen fare girişini izlemek için WH_MOUSE kancasını kullanabilirsiniz.

Daha fazla bilgi için bkz. MouseProc geri çağırma işlevi.

WH_MSGFILTER ve WH_SYSMSGFILTER

WH_MSGFILTER ve WH_SYSMSGFILTER kancaları, bir menü, kaydırma çubuğu, ileti kutusu veya iletişim kutusu tarafından işlenmek üzere olan iletileri izlemenize ve kullanıcının ALT+SEKME veya ALT+ESC tuş bileşimine basması sonucunda farklı bir pencerenin ne zaman etkinleştirilmek üzere olduğunu algılamanıza olanak tanır. WH_MSGFILTER kancası yalnızca bir menüye, kaydırma çubuğuna, ileti kutusuna veya kanca yordamını yükleyen uygulama tarafından oluşturulan iletişim kutusuna geçirilen iletileri izleyebilir. WH_SYSMSGFILTER kancası tüm uygulamalar için bu tür iletileri izler.

WH_MSGFILTER ve WH_SYSMSGFILTER kancaları, ana ileti döngüsünde yapılan filtrelemeye eşdeğer kalıcı döngüler sırasında ileti filtreleme gerçekleştirmenizi sağlar. Örneğin, bir uygulama genellikle kuyruktan iletiyi aldığı zaman ile iletiyi gönderme zamanı arasında ana döngüdeki yeni bir iletiyi inceler ve uygun şekilde özel işlem gerçekleştirir. Ancak, bir kalıcı döngü sırasında sistem, bir uygulamaya ana ileti döngüsündeki iletileri filtreleme şansı vermeden iletileri alır ve dağıtır. Bir uygulama bir WH_MSGFILTER veya WH_SYSMSGFILTER kanca yordamı kurarsa, sistem mod döngüsü sırasında yordamı çağırır.

Bir uygulama, CallMsgFilter işlevini çağırarak WH_MSGFILTER kancasını doğrudan çağırabilir. Uygulama bu işlevi kullanarak, ana ileti döngüsünde kullandığı gibi kalıcı döngüler sırasında iletileri filtrelemek için aynı kodu kullanabilir. Bunu yapmak için, filtreleme işlemlerini bir WH_MSGFILTER kanca yordamında kapsülleyin ve ardından bu işlemleri, GetMessage ve DispatchMessage işlevlerine yapılan çağrılar arasında CallMsgFilter çağrısını yaparak gerçekleştirin.

while (GetMessage(&msg, (HWND) NULL, 0, 0)) 
{ 
    if (!CallMsgFilter(&qmsg, 0)) 
        DispatchMessage(&qmsg); 
} 

CallMsgFilter son bağımsız değişkeni yalnızca kanca yordamına geçirilir; herhangi bir değer girebilirsiniz. MSGF_MAINLOOPgibi bir sabit tanımlayarak kanca yordamı, yordamın nereden çağrıldığını belirlemek için bu değeri kullanabilir.

Daha fazla bilgi için bkz. MessageProc ve SysMsgProc geri çağırma işlevleri.

WH_SHELL

Kabuk uygulaması önemli bildirimleri almak için WH_SHELL kancasını kullanabilir. Sistem, kabuk uygulaması etkinleştirilmek üzere olduğunda ve üst düzey bir pencere oluşturulduğunda veya yok edildiğinde bir WH_SHELL kanca yordamı çağırır.

Özel kabuk uygulamalarının WH_SHELL iletilerini almadıklarını unutmayın. Bu nedenle, kendisini varsayılan kabuk olarak kaydeden tüm uygulamaların (veya başka bir uygulamanın) WH_SHELL iletileri alabilmesi için önce SystemParametersInfo işlevini çağırması gerekir. Bu işlev SPI_SETMINIMIZEDMETRICS ve MINIMIZEDMETRICS yapısıyla çağrılmalıdır. Bu yapının iArrange üyesini ARW_HIDEolarak ayarlayın.

Daha fazla bilgi için bkz. ShellProc geri çağırma işlevi.