كيفية استخدام بشكل صحيح SetWindowsHookEx & CallNextHookEx

StackOverflow https://stackoverflow.com/questions/214022

  •  03-07-2019
  •  | 
  •  

سؤال

لا يمكن بشكل صحيح الإعداد windows هوك ، ولكن يمكنني الحصول على الخلط من جانب خط في MSDN الذي يقول "واصفا CallNextHookEx وظيفة سلسلة التالي هوك الإجراء هو اختياري ولكن يوصى بشدة ؛ وإلا غيرها من التطبيقات التي تم تثبيتها السنانير لن تتلقى هوك الإخطارات و قد تتصرف بشكل غير صحيح نتيجة لذلك.يجب عليك الاتصال CallNextHookEx إلا إذا كنت في حاجة على الإطلاق إلى منع الإعلام من أن ينظر إليها من قبل التطبيقات الأخرى.".

أريد أن تكون جيدة البرمجة المواطن استدعاء المقبل هوك.ولكن هوك بلدي الإجراء يبدو مثل هذا:

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

ماذا يحدث في ربط الإجراء إذا كان رمز ليس واحد أنا مهتم ؟ كيف يمكنني الاتصال التالي هوك ؟

تحرير: المشكلة الرئيسية هي أن HHOOK هو عاد من SetWindowsHookEx, و التي تحتاج إلى أن تنتقل إلى CallNextHookEx وظيفة.

تحديث: يبدو هوك المعلمة تجاهلها على NT منصات:
http://msdn.microsoft.com/en-us/library/ms644974.aspx
http://www.klenotic.com/pl/null_hhook/

هل كانت مفيدة؟

المحلول

وفقا مستندات, الشيء الصحيح القيام به هو تمرير الحجج التي تلقيتها مباشرة إلى CallNextHookEx ، بالضبط كما كنت تلقى منهم.يجب أيضا استدعاء CallNextHookEx بغض النظر عما إذا كنت قررت التعامل مع هوك الرسالة.

وفقا MSDN, أول معلمة CallNextHookEx يتم تجاهل على NT/XP/2003 لكبار السن Win95 أنظمة التشغيل المستندة إلى أنه ينبغي أن يكون HHOOK التي تلقيتها عندما كنت مسجلة هوك الخاص بك مع SetWindowsHookEx.مستندات لا تحدد قيمة لنظام التشغيل Windows 2000 ، ولكن بما أنه جزء من الأسرة NT, تخمين معقول هو أنه تجاهل هناك أيضا.

كل هذا وسيلة جيدة رمز طريقة NT-عائلة أنظمة التشغيل قد يكون هذا:

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
}

وهذا يجعل التأكد من أن كنت دائما اتصل هوك في نهاية المعالجة ، يجعل من الصعب بطريق الخطأ إضافة return من شأنها أن تجاوز CallNextHookEx.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top