2008-10-17 10 views
8

Tôi có thể thiết lập chính xác một móc cửa sổ, nhưng tôi bị nhầm lẫn bởi dòng trong MSDN nói rằng "Gọi chức năng CallNextHookEx để chuỗi đến thủ tục móc tiếp theo là tùy chọn, nhưng nó là rất khuyến khích Nếu không, các ứng dụng khác đã cài đặt móc sẽ không nhận được thông báo móc và có thể hoạt động không chính xác như là kết quả. Bạn nên gọi CallNextHookEx trừ khi bạn hoàn toàn cần phải ngăn chặn các thông báo được nhìn thấy bởi các ứng dụng khác.Làm thế nào để sử dụng chính xác SetWindowsHookEx & CallNextHookEx

Tôi muốn trở thành công dân lập trình tốt và gọi móc tiếp theo. Tuy nhiên, quy trình móc của tôi trông giống như sau:

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(...); 
     ... 
} 

Vì vậy, điều gì xảy ra trong quy trình móc nếu mã không phải là mã tôi quan tâm? Làm thế nào để tôi gọi móc tiếp theo?

Chỉnh sửa: Vấn đề chính là HHOOK được trả về từ SetWindowsHookEx và cần được chuyển đến hàm CallNextHookEx.

Cập nhật: Có vẻ như các tham số móc bị bỏ qua trên nền tảng NT:
http://msdn.microsoft.com/en-us/library/ms644974.aspx
http://www.klenotic.com/pl/null_hhook/

Trả lời

10

Theo các tài liệu, điều thích hợp để làm là vượt qua các đối số mà bạn nhận được trực tiếp đến CallNextHookEx, chính xác như bạn nhận được chúng. Bạn cũng nên gọi CallNextHookEx bất kể bạn quyết định xử lý thông điệp móc.

According to MSDN, tham số đầu tiên CallNextHookEx bị bỏ qua trên trên NT/XP/2003, và cho các hệ điều hành cũ Win95 dựa trên nó nên là HHOOK bạn nhận được khi đăng ký móc của bạn với SetWindowsHookEx. Các tài liệu không chỉ định một giá trị cho Windows 2000, nhưng vì nó là một phần của gia đình NT, một dự đoán hợp lý là nó bị bỏ qua ở đó là tốt.

Với tất cả những gì, một cách tốt để mã hóa các phương pháp cho hệ điều hành NT-gia đình có thể là thế này:

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 
} 

Điều này đảm bảo rằng bạn luôn gọi hook vào cuối xử lý của bạn, và làm cho thật khó để vô tình thêm một số return sẽ bỏ qua CallNextHookEx.

+0

Điều đó không có tác dụng vì CallNextHookEx nhận tham số HHOOK (được trả về từ SetWindowsHookEx). –

+0

Rất tiếc, tôi sẽ cập nhật câu trả lời của mình. – Charlie

+0

Hmm, bạn có thể vào một cái gì đó ở đó. Tôi bị mất một chút về tham số "hhk" bị bỏ qua trên NT/XP/2003. Bây giờ hãy thử một chút. –