Форум — Ответы ( К темам )
? | quaSAR: Беда! SetWindowsHookEx (21-02-2003 07:37:33) |
Делаю перехватчик клавиатуры. Все вроде работает, НО!!! /mainunit.cpp\ #include "globals.h" .... hhk = SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)KeyboardProc, (HINSTANCE)GetCurrentProcessId(), 0); .... MSG msg; while (GetMessage(&msg,0,0,0)) { if (isdestroyed) //isdestroyed == true когда приложение закрывается { UnhookWindowsHookEx(hhk); }; TranslateMessage(&msg); DispatchMessage (&msg); }; .... /functions.cpp\ #include "globals.h" HHOOK hhk; BOOL isdestroyed; .... LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam) { if (code >= 0) { Beep(0,0); // memcpy (SBuffer, (void *)wParam, 1); !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! return 0; } else return CallNextHookEx ((HHOOK)hhk, code, wParam, lParam); }; /globals.h\ #ifndef HGLOBALSFILE #define HGLOBALSFILE #include <windows.h> extern void * SBuffer; extern HHOOK hhk; extern BOOL isdestroyed; extern LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam); Суть проблемы в том, что когда выполняется строка , помеченная !!!!!!!!!!!!!!!!, возникает ошибка типа AccessViolation по адресу FFFFFFFF.... Вот если оставить только функцию Beep(..) то она прекрасно выполняется. Чувствую что вопрос ламера! Что мне делать, господа профи ?? | |
Павел (21-02-2003 20:34:46) | |
Я не профи, просто 1/ вызывает сомнение необходимость использования memcpy() 2/ возможно вы, объявив указатель void * SBuffer не выделили для него под wParam необходимую память. (хоть и всего слово) — во всяком случае в том коде, что вы привели, выделения памяти под SBuffer нет и копирование wParam происходит куда-то непонятно куда отсюда и возникает ошибка типа AccessViolation по адресу FFFFFFFF.... | |
Георгий (22-02-2003 12:01:48) | |
Я не профи., просто 1. FFFFFFFF == -1 т.е. в wParam у тебя -1 А Mircosoft отрицательные коды истользует для обозначения особых ситуаций... 2. может действительно память под SBuffer не выделил ? или выделил но не так как надо — попробуй через GlobalAlloc 3. я в хуках плохо разбираюсь, но у тебя в адресное пространство другой задачи входит только функция хук? если это так, то через память данные передавать не получится — разные задачи у них свои адресные пространства, причём линейные адреса могут совпадать и передачу данных надо делать через механизмы межпроцесной связи — начиная с Windows Message (SendMessage и т.п.) и закинчивая DDE,OLE,COM... |