هل يمكنني وضع LowLevelMouseProc و LowLevelKeyboardProc في الرئيسية EXE ؟

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

  •  08-07-2019
  •  | 
  •  

سؤال

العالمية ويندوز السنانير يجب أن يكون في DLL لأن هوك سوف يكون دعا في سياق عملية مختلفة ، وبالتالي فإن الإجراء ربط مدونة يجب أن يتم حقنه في تلك العملية.ومع ذلك ، هناك القيود:

SetWindowsHookEx يمكن أن تستخدم لحقن DLL في عملية أخرى.32 بت DLL لا يمكن حقن 64 بت العملية ، و 64 بت DLL لا يمكن حقن في عملية 32-بت.إذا التطبيق يتطلب استخدام السنانير في عمليات أخرى ، هو مطلوب منها أن تطبيق 32 بت الاتصال SetWindowsHookEx لحقن 32 بت DLL 32-بت العمليات ، تطبيق 64-بت الاتصال SetWindowsHookEx لحقن 64 بت DLL إلى 64 بت العمليات.32-بت و 64-بت DLLs يجب أن يكون مختلف أسماء.

لهذا السبب أنا أفضل استخدام مستوى منخفض السنانير WH_MOUSE_LL و WH_KEYBOARD_LL, بدلا من WH_MOUSE و WH_KEYBOARD.كما رأينا من بهم الوثائق:

هذا هوك يسمى في سياق الخيط الذي قمت بتثبيته.الدعوة يتم عن طريق إرسال رسالة إلى موضوع مثبت هوك.ولذلك فإن موضوع مثبت هوك يجب أن يكون رسالة حلقة.

هذا يجعلني أعتقد أن هذه هوك الإجراءات لا تحتاج إلى أن تكون في DLL منفصلة و يمكن أن يعيش فقط داخل EXE أن مدمن مخدرات لهم.على وثائق SetWindowsHookEx, ومع ذلك يقول:

lpfn

[في] مؤشر إلى عملية ربط.إذا كان dwThreadId المعلمة هو صفر أو يحدد معرف موضوع إنشاؤه من قبل مختلف العملية ، lpfn المعلمة يجب أن نشير إلى ربط الإجراء في DLL.

لا صريحة استثناء اثنين من مستوى منخفض السنانير المذكورة.

لقد رأيت عدة .صافي التطبيقات التي تستخدم على مستوى منخفض السنانير دون وجود إجراءات ربط في DLL منفصلة.هذا هو تلميح آخر أن هذا غير مقبول.ومع ذلك, أنا خائف أن أفعل ذلك بنفسي منذ الوثائق يحظر ذلك.

لا أحد يتوقع أي مشكلة إذا كنت لا تستخدم DLL و ضع هذه على مستوى منخفض إجراءات ربط مباشرة إلى EXE ؟

تحرير:على فضله ، أود نهائي "نعم, هذا هو موافق ، لأن" أو "لا, هذا يمكن أن تذهب الخطأ ، لأن...".

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

المحلول

هناك استثناء واحد إلى العالمية تركيب دالة في dll القاعدة.انخفاض مستوى الماوس و لوحة المفاتيح السنانير يتم تنفيذها في سياق عملية الاستدعاء ، وليس عملية يجري مدمن مخدرات (داخليا ويندوز بإعلام هوك الخاص بك عن طريق رسالة windows).ولذلك ربط المدونة ليست إعدام تعسفي في عملية يمكن أن تكون مكتوبة .صافي.انظر http://www.codeproject.com/KB/cs/CSLLKeyboardHook.aspx على سبيل المثال.

أخرى السنانير تحتاج إلى استدعاء 32 بت من SetWindowsHookEx وتمرير ربط وظيفة في 32bit عملية استدعاء 64bit نسخة من SetWindowsHookEx وتمرير ربط وظيفة في 64bit العملية ، على الرغم من.

نصائح أخرى

تبين أن هذا هو في الحقيقة في الوثائق.وإن لم يكن في وثائق SetWindowsHookEx والأصدقاء, ولكن في أ .صافي مقالة قاعدة المعارف.

مستوى منخفض إجراءات ربط يطلق على الخيط الذي المثبتة هوك.مستوى منخفض السنانير لا تتطلب أن هوك يتم تنفيذ الإجراء في DLL.

العالمية السنانير ، سواء كانت منخفضة أو عالية المستوى ، يجب أن تكون منفصلة DLL التي يمكن تحميلها في كل عملية.الوثائق التي نقلت يجعل هذا واضح جدا, و إذا كان هناك استثناء تطبيقها على مستوى منخفض السنانير ، تلك الوثائق أن أقول ذلك أيضا.

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

تحرير:أنا أسحب إجابتي السابقة.اتضح أن WH_MOUSE_LL و WH_KEYBOARD_LL استثناءات من القاعدة المعتادة عن العالمية السنانير:

ما هو HINSTANCE تمريرها إلى SetWindowsHookEx المستخدمة ؟

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