سؤال

أقوم بإنشاء تطبيق وحدة تحكم أود تسجيل مكابس المفاتيح (مثل السهم UP). لقد قمت بإنشاء خطاف لوحة مفاتيح منخفض المستوى من المفترض أن يلتقط جميع مكابس المفاتيح في أي مؤشر ترابط واستدعاء وظيفة رد الاتصال الخاصة بي ، لكنها لا تعمل. يتوقف البرنامج قليلاً عندما ضربت مفتاحًا ، لكنني لا أتحمل رد الاتصال أبدًا. لقد راجعت الوثائق ولكن لم أجد أي شيء. لا أعرف ما إذا كنت أستخدم setWindowshookex () بشكل غير صحيح (على حد علمي ، فإنه ينشئ الخطاف بنجاح) أو أن وظيفة رد الاتصال الخاصة بي غير صحيحة! لست متأكدًا ما هو الخطأ! شكرا مقدما للمساعدة.

#include "Windows.h"
#include <iostream>
using namespace std;

HHOOK hookHandle;

LRESULT CALLBACK keyHandler(int nCode, WPARAM wParam, LPARAM lParam);

int _tmain(int argc, _TCHAR* argv[]) {

 hookHandle = SetWindowsHookEx(WH_KEYBOARD_LL, keyHandler, NULL, 0);

 if(hookHandle == NULL) {
  cout << "ERROR CREATING HOOK: ";
  cout << GetLastError() << endl;
  getchar();
  return 0;
 }

 MSG message;

 while(GetMessage(&message, NULL, 0, 0) != 0) {
  TranslateMessage( &message );
  DispatchMessage( &message );
 }

 cout << "Press any key to quit...";
 getchar();

 UnhookWindowsHookEx(hookHandle);

 return 0;
}


LRESULT CALLBACK keyHandler(int nCode, WPARAM wParam, LPARAM lParam) {
 cout << "Hello!" << endl;

 // Checks whether params contain action about keystroke
 if(nCode == HC_ACTION) {
  cout << ((KBDLLHOOKSTRUCT *) lParam)->vkCode << endl;
 }

 return CallNextHookEx(hookHandle, nCode, 
            wParam, lParam);
}
هل كانت مفيدة؟

المحلول

لا يمكنك حظر على syscall (getChar) ، يجب أن تقوم بتشغيل حلقة نافذة ومعالجة الرسائل قبل أن يتم استدعاء الخطاف.

نصائح أخرى

على Windows XP ، تحتاج ، تحتاج إلى المرور hInstance (من عند WinMain) كحجة ثالثة SetWindowsHookEx. علي سبيل المثال:

int WINAPI WinMain
( HINSTANCE hInstance, HINSTANCE hPrevInstance,
  LPTSTR lpCmdLine, int nCmdShow ) {

  hookHandle = SetWindowsHookEx ( WH_KEYBOARD_LL, keyHandler, hInstance, 0 );

// ...

أقترح Simle أولاً ؛

// vb: استرداد مثيل التطبيقات hinstance appinstance = getModuleHandle (null) ؛

ثم: hookhandle = setwindowshookex (wh_keyboard_ll ، keyhandler ، appinstance ، 0) ؛

// ... ، ولكن هناك أخطاء أخرى في وقت لاحق أيضًا

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