HOME FORUMS MEMBERS RECENT POSTS LOG IN  
× Авторизация
Имя пользователя:
Пароль:
Нет аккаунта? Регистрация
Баннер 1   Баннер 2
НОВЫЕ ТОРГОВАЯ НОВОСТИ ЧАТ
loading...
Скрыть
Вернуться   ANTICHAT > ПРОГРАММИРОВАНИЕ > С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

Ловушка сообшений
  #1  
Старый 03.06.2008, 10:01
hub00
Новичок
Регистрация: 02.06.2008
Сообщений: 4
С нами: 9441910

Репутация: 0
По умолчанию Ловушка сообшений

Здравствуйте, помогите решить задачу.

Установил глобальный hook = SetWindowsHookEx(WH_CALLWNDPROCRET, @HookProc, HInstance, 0);
Необходимо поймать сообщение WM_SETCURSOR.
После запуска программы вылетает "Ошибка чтения памяти и её адрес"
Однако если использовать hook WH_JOURNALRECORD то программа запускается и такие сообщения как:
WM_MOUSEMOVE, WM_LBUTTONDOWN, WM_LBUTTONUP, WM_RBUTTONDOWN, WM_RBUTTONUP, WM_KEYUP, WM_KEYDOWN
ловятся.
А вот WM_SETCURSOR Нет.
Может я что-то не указываю? Или это сообщение нужно обрабатывать как-то?

Спасибо.

Листинг :

var
HookHandle: hHook;

function HookProc(Code: integer; WParam: word; LParam: Longint): Longint; stdcall;
var
msg: PEVENTMSG;
begin
if Code >= 0 then begin
result := 0;
msg := Pointer(LParam);
with Form1 do
case msg.message of

WM_SETCURSOR : Label1.Caption:='Сообщение получено.';

end;
end else
result := CallNextHookEx(HookHandle, code, WParam, LParam);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
HookHandle := SetWindowsHookEx(WH_CALLWNDPROCRET, @HookProc, HInstance, 0);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
if HookHandle <> 0 then
UnhookWindowsHookEx(HookHandle);
end;
 
Ответить с цитированием

  #2  
Старый 03.06.2008, 12:55
Jes
Постоянный
Регистрация: 16.04.2007
Сообщений: 398
С нами: 10037186

Репутация: 1462
По умолчанию

HookProc у тебя в dll находится?
 
Ответить с цитированием

  #3  
Старый 03.06.2008, 13:02
hub00
Новичок
Регистрация: 02.06.2008
Сообщений: 4
С нами: 9441910

Репутация: 0
По умолчанию

нет. Все в одном.
 
Ответить с цитированием

  #4  
Старый 03.06.2008, 13:15
Jes
Постоянный
Регистрация: 16.04.2007
Сообщений: 398
С нами: 10037186

Репутация: 1462
По умолчанию

Цитата:
A global hook procedure can be called in the context of any application in the same desktop as the calling thread, so the procedure must be in a separate DLL module.
msdn
вообщем обработчик глобального хука должен быть расположен в dll (как раз чтобы избежать проблем с доступом к памяти и тп ...)

ну и коротенький экскурс ( http://www.delphisources.ru/pages/fa...eate_hook.html )
Подробнее о механизме хуков :http://sources.ru/delphi/dll/hooks_aspects.shtml

Лучше (понятнее) всего о хуках и перехватах у Рихтера описанно

Последний раз редактировалось Jes; 03.06.2008 в 13:18..
 
Ответить с цитированием

  #5  
Старый 03.06.2008, 13:32
hub00
Новичок
Регистрация: 02.06.2008
Сообщений: 4
С нами: 9441910

Репутация: 0
По умолчанию

Изучал я их .
Вроде ж делаю как в них и описывается.
 
Ответить с цитированием

  #6  
Старый 03.06.2008, 16:43
0verbreaK
Постоянный
Регистрация: 30.04.2008
Сообщений: 323
С нами: 9489537

Репутация: 136
По умолчанию

Цитата:
Сообщение от hub00  
Изучал я их .
Вроде ж делаю как в них и описывается.

Вот хорошая статья, с практическим рассмотрением хуков, на мышку, правда язык, ассемблер.
http://www.wasm.ru/article.php?article=1001024
 
Ответить с цитированием

  #7  
Старый 05.06.2008, 01:31
hub00
Новичок
Регистрация: 02.06.2008
Сообщений: 4
С нами: 9441910

Репутация: 0
По умолчанию

Вопрос маленький.
Вот я получаю дескрипторе текущего курсора для текущей формы.
a:=GetCursor();
А как сделать так чтоб я его получал за её пределами (глобальный дескриптор курсор)?
 
Ответить с цитированием
Ответ





Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT ™ © 2001- Antichat Kft.

×

Внести депозит

Введите сумму USDT:

Принимается только USDT TRC20. Fake/Flash USDT не засчитывается.

×

Вывести депозит

Сумма USDT:

Ваш USDT TRC20 кошелек:

Заявка будет отправлена администратору.