link9940 link9941 link9942 link9943 link9944 link9945 link9946 link9947 link9948 link9949 link9950 link9951 link9952 link9953 link9954 link9955 link9956 link9957 link9958 link9959 link9960 link9961 link9962 link9963 link9964 link9965 link9966 link9967 link9968 link9969 link9970 link9971 link9972 link9973 link9974 link9975 link9976 link9977 link9978 link9979 link9980 link9981 link9982 link9983 link9984 link9985 link9986 link9987 link9988 link9989 link9990 link9991 link9992 link9993 link9994 link9995 link9996 link9997 link9998 link9999 link10000 link10001 link10002 link10003 link10004 link10005 link10006 link10007 link10008 link10009 link10010 link10011 link10012 link10013 link10014 link10015 link10016 link10017 link10018 link10019 link10020 link10021 link10022 link10023 link10024 link10025 link10026 link10027 link10028 link10029 link10030 link10031 link10032 link10033 link10034 link10035 link10036 link10037 link10038 link10039 link10040 link10041 link10042 link10043 link10044 link10045 link10046 link10047 link10048 link10049 link10050 link10051 link10052 link10053 link10054 link10055 link10056 link10057 link10058 link10059 link10060 link10061 link10062 link10063 link10064 link10065 link10066 link10067 link10068 link10069 link10070 link10071 link10072 link10073 link10074 link10075 link10076 link10077 link10078 link10079 link10080 link10081

Форум — Ответы     (  К темам )
 ?  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...