Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.09.16;
Скачать: CL | DM;

Вниз

Хук на сообщение WM_SYSCOMMAND. Проблема.   Найти похожие ветки 

 
Song ©   (2002-09-04 17:22) [0]

Проблема продолжается.
Т.к. согласно MSDN"у WM_SYSCOMMAND с WParam=SC_SCREENSAVE посылается только активному
окну, я написал хук, в котором ловлю это сообщение, когда окно с программой неактивно.
Основную цель, которую я преследовал такая: программа, определяя чужое сообщение с SC_SCREENSAVE должна пустить своему (неактивному) окну такое же сообщение, чтобы дать ему понять, что запускается хранитель экрана, когда активна другая прога.
Всё в принципе работает:

[code]Library SSaver;
Uses Windows, SysUtils;

Var SysHook:HHook=0;
KLDExpertHandle:HWND=0;

Function SysMsgProc(Code:Integer; ParamW:WParam; ParamL:LParam):LongInt; stdcall;
Begin
IF (Code=HCBT_SYSCOMMAND) and (ParamW=SC_SCREENSAVE) and (GetForeGroundWindow<>KLDExpertHandle) then SendMessage(KLDExpertHandle,$0112,SC_SCREENSAVE,0);
//MessageBox(0, PChar(IntToStr(KLDExpertHandle)),"", 0); // Здесь проверяю дискриптор но получаю ноль!
Result:=CallNextHookEx(SysHook,Code,ParamW,ParamL);
end;

procedure Hook(Flag:Boolean; AppHandle:HWND); export; stdcall;
begin
IF Flag then
Begin
SysHook:=SetWindowsHookEx(WH_CBT,@SysMsgProc,HInstance,0);
KLDExpertHandle:=AppHandle;
MessageBox(0, PChar(IntToStr(KLDExpertHandle)),"", 0); // А здесь я убеждаюсь, что в процедуру инициализации хука переданное мною число в переменной AppHandle доходит до DLL
End Else
Begin
UnhookWindowsHookEx(SysHook);
SysHook:=0;
End;
end;

exports Hook;

end.[/code]

Дак вот. В процедуру инициализации хука Hook() я передаю дискриптор моей программы (AppHandle), он передаётся (проверяю по MessageBox), присваивается глобальной переменной KLDExpertHandle, но при перехвате сообщения я получаю нуль (см. выше) в этой переменной. Почему так происходит и как сделать?Интересует практическое решение.


 
AFrolov ©   (2002-09-04 17:51) [1]

Читай статьи про Hook на этом сайте. Там есть рабочий пример. Происходит следующее: ты передаешь Handle в экземпляр DLL который загружается в адресное пространство твоего приложения у (длл загруженных в адресные пространства разных процессов области данных не пересекаются - подробнее читай в статьях). Одно из возможных практических решений - использование FileMapping.


 
Виктор Щербаков ©   (2002-09-04 17:52) [2]

А зачем еще одна ветка?
http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1031145784&n=0


 
Suntechnic ©   (2002-09-04 19:26) [3]

В VC++ для решения подобной проблемы может быть использована деректива #pragma data_seg("") с помощью которой можно поместить данные в разделяемую секцию. Если в Delphi подобного нет, то может целесообразно написать Hook Dll на C, чтобы не возиться с FileMapping?


 
Song ©   (2002-09-04 21:01) [4]

Я решил проблему. Правда осталось одна странность (реализованный хук не срабатывает, если активное приложение - консольное, FAR или DN например), но это не так важно на данный момент. Спасибо всем за помощь и внимание.

>>А зачем еще одна ветка?
Когда я писал сообщение, браузер глюкнул и послалось две. А народ начал отвечать в обе, вот так и получилось :-)

Thanks to all!


 
Song ©   (2002-09-04 21:02) [5]

Кстати из вышеприведённого примера поменял всего лишь строчку :-)
Схитрил :-) (помог Алексей в примере к статье своим комментарием в программе)



Страницы: 1 вся ветка

Текущий архив: 2002.09.16;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.047 c
14-50941
RV
2002-08-08 13:53
2002.09.16
Где есь сайты, крые пишут IP входящего (где нибудь на заглавной)


3-50632
ShuraGrp
2002-08-22 17:33
2002.09.16
DBRestore ??


6-50892
Sapersky_
2002-07-02 21:47
2002.09.16
Ошибка 10022 при попытке послать данные


1-50806
mvg_first
2002-09-03 14:59
2002.09.16
Подскажите компонент для записи видео с видеовхода


1-50680
nimble
2002-09-05 05:51
2002.09.16
Pointer&Dynamic Array