Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Отмена обработки сообщения Windows (API), Как блокировать сообщение windows. 
:(
    Опции темы
sani79
Дата 15.1.2006, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 14.12.2005

Репутация: нет
Всего: нет



Как перехватить сообщение windows до начала его обработки системой и в определенном случае отменить его обработку. Например сообщение WM_SYSKEYDOWN, в зависимости от того какая клавиша нажата либо пропустить сообщение, либо блокировать его так как будто его не было. ?
PM MAIL   Вверх
mes
Дата 15.1.2006, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 2
Всего: 250



Код

Type Form1 =
    ....
  procedure SysKeyDown(var Message: TWMChar); [color=green]message WM_SysKeydown[/color];
    ....
  end;

implements
   .....
  procedure Form1.SysKeyDown(var Message: TWMChar); message WM_SysKeydown;
  begin

//     Проверяешь нузно ли тебе это сообщение 
//     например так:

    [color=green]   if ......   then ....[/color]

//    Если не нужно, отдаешь дальше системе (точнее перекрытому методу )  

      [color=green] else  inherited[/color]

 end;


Это сообщение отредактировал(а) Girder - 18.1.2006, 10:37


--------------------
PM MAIL WWW   Вверх
sani79
Дата 15.1.2006, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 14.12.2005

Репутация: нет
Всего: нет



Спасибо за ответ. Но вопрос далее - а как быть если сообщение нужно отменить, не передавать его дальше вообще, либо передать какое то другое вместо него?
PM MAIL   Вверх
mes
Дата 15.1.2006, 19:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 2
Всего: 250



smile напишу более подробно:



1) Чтоб передать сообщение системе нужно вызвать перекрытый метод: inherited

begin
..... // Обработка сообщения до системы
inherited // Вызов системной ф-ции обработки
.... // Обработка сообщения после системы
end;


2) Если не хочешь передовать не вызывай этот метод.

3) Если хочешь передать при условии, поставь условие: if ... then .... else inherited
case ... of .... else inherited
4) Если хочешь послать другое сообщение, пошли другое сообщение с помощью
Sendmessage (Handle, Msg, WParam, LParam)





--------------------
PM MAIL WWW   Вверх
FRAGNATIC
Дата 15.1.2006, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


..::Свирепый Кодер::..
**


Профиль
Группа: Участник
Сообщений: 901
Регистрация: 17.10.2004
Где: ICQ

Репутация: нет
Всего: 11



hook поставить =)
PM MAIL   Вверх
sani79
Дата 16.1.2006, 09:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 14.12.2005

Репутация: нет
Всего: нет



Спасибо за советы. В общем у меня все получилось, единственно сейчас пробую ршение через хук и есть проблемка... написал dll:
Код

library hd;

uses
  SysUtils, Classes, Windows, Messages, Dialogs;
var
 SysHook : HHook = 0;
 Wnd : Hwnd = 0;  

function SysMsgProc(code : integer; wParam : word;
 lParam : longint) : longint; stdcall;
begin
   if TMsg(Pointer(lParam)^).message = WM_SysKeydown then
     if TMsg(Pointer(lParam)^).wParam = ... then ShowMessage('TEST');
    CallNextHookEx(SysHook, Code, wParam, lParam);
end;

procedure RunStopHook(State : Boolean) export; stdcall;
begin

 if State=true then SysHook := SetWindowsHookEx(WH_GETMESSAGE, @SysMsgProc, HInstance, 0);
 else  
 begin
   UnhookWindowsHookEx(SysHook);
   SysHook := 0;
 end;
end;

exports RunStopHook index 1;

begin
end.


Ловушка срабатывает, но следом возникает ошибка и далее вплоть до зависания винды...
сейчас разбираюсь... длл писал на основе нескольких разных примеров, возможно что-то недопонял. Если кто видит ошибку, буду признателен если укажите... насколько я понимаю проблема в передачи сообщения после срабатывания ловушки....
PM MAIL   Вверх
bems
Дата 17.1.2006, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 21
Всего: 88



Процедура хука работает в контексте процесса который послал сообщение. Перед вызовом длл подключается к этому процессу и работает с собственной копией данных. Поэтому переменная HHook в теле процедуры хука у тебя равна нулю (присваивание касается копии переменной для процессы установившего хук, все будет работать только если ты установишь хук не для всех потоков, а только своих). Поэтому в CallNextHookEx ты передаешь нуль - так не надо.

Параметр wParam не смотря на название имеет тот же тип что и lParam (тоже 4 байта).

Есть еще одна не критическая ошибка, но лучше бы тебе в этом разобраться. Ты устанавливаешь хук типа WH_GETMESSAGE, а процедуру хука пишешь как для WH_SYSMSGFILTER. Тебе повезло что для обоих типов lParam ссылается на одинаковою запись. Но не для всех типов это так, и если ты изменишь тип на какой-нибудь еще, то надо переписать и процедуру хука. Еще эти типы отличаются значением параметра code, но ты его не анализируешь (Почему?) - в общем это тебе еще повезло. Кстати, CallNextHookEx нужно вызывать или не вызывать в зависимости от этого самого code


--------------------
Обижено школьников: 8
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0473 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.