2008-10-17 17 views
8

Bir windows kanca doğru şekilde kurabilirim, ancak MSDN'deki satırın kafasını karıştırıyorum "CallNextHookEx işlevinin bir sonraki kanca işlemine göre zincirlenmesi isteğe bağlıdır, ancak önemle önerilir. aksi taktirde, kanca takmış olan diğer uygulamalar kanca bildirimleri almaz ve sonuç olarak hatalı davranabilir. Bildirimin başka uygulamalar tarafından görülmesini kesinlikle engellemeniz gerekmedikçe, CallNextHookEx'i aramalısınız. ".Doğru şekilde nasıl kullanılırWindowsHookEx & CallNextHookEx

İyi bir programlama vatandaşı olmak ve bir sonraki çanı aramak istiyorum. Ama, benim kanca işlemi şöyle görünür: Kod benim ilgilendiğim biri değilse

LRESULT CALLBACK CBTProc(int code, WPARAM wp, LPARAM lp) 
{ 
    if (code != HCBT_CREATEWND) 
     { 
       // What do I do here? It's not the event I requested so how do I pass it on? 
     return 0; 
    } 

    // It's the code we want (create window) 
     CallNextHookEx(...); 
     ... 
} 

yani, kanca işlemi ne olur? Bir sonraki kancayı nasıl ararım?

Düzenleme: Ana sorun, bir HHOOK SetWindowsHookEx döndürülen ve bu CallNextHookEx işlevine geçirilmesi gereken olmasıdır.

Güncelleme: Bu kanca parametre NT platformlarda göz ardı edilir görünüyor:
http://msdn.microsoft.com/en-us/library/ms644974.aspx
http://www.klenotic.com/pl/null_hhook/

cevap

10

Docs göre yapılacak doğru şey doğrudan CallNextHookEx için alınan değişkenler geçirebilirsiniz, Tam olarak onları aldığınız gibi. Ayrıca, kanca mesajını işlemeye karar verdiğinizden bağımsız olarak CallNextHookEx'i de aramalısınız.

According to MSDN

, CallNextHookEx ilk parametre NT/XP/2003 tarihinde üzerinde göz ardı edilir ve daha eski Win95 tabanlı işletim sistemleri için olması gerektiği HHOOK Eğer SetWindowsHookEx ile kanca kayıt sırasında aldı. Dokümanlar Windows 2000 için bir değer belirtmez, ancak NT ailesinin bir parçası olduğu için, makul bir tahminin de orada göz ardı edilmesidir.

Verilen bütün bu, NT ailesi işletim sistemleri için bir yöntem kod için iyi bir yol bu olabilir:

LRESULT CALLBACK CBTProc(int code, WPARAM wp, LPARAM lp) 
{ 
    if(code == HCBT_CREATEWND) 
     ProcessCreateWnd(wp, lp); 
    return CallNextHookEx(0, code, wp, lp); 
} 

void ProcessCreateWnd(WPARAM wp, LPARAM lp) 
{ 
    // my code here 
} 

Bu, her zaman işleme sonunda kanca çağrı emin olur ve markaları yanlışlıkla CallNextHookEx baypas edecek bir return eklemek zor.

+0

Bu işe yaramaz çünkü CallNextHookEx bir HHOOK parametresi alır (SetWindowsHookEx'dan döndürülür). –

+0

Üzgünüz, Cevabımı güncelleyeceğim. – Charlie

+0

Hmm, orada bir şey olabilir. NT/XP/2003'te yok sayılan "hhk" parametresiyle ilgili özlemi kaçırdım. Şimdi biraz test yapalım. –