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

Вниз

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

 
Song ©   (2002-09-04 17:23) [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, но при перехвате сообщения я получаю нуль (см. выше) в этой переменной. Почему так происходит и как сделать?Интересует практическое решение.


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

Хук, насколько я понял, глобальный. Но не вижу откуда берется значение SysHook и KLDExpertHandle. Ведь длл присоединяется ко многим процессам. Т.е. должна быть процедура инициализации длл и в ней, на DLL_PROCESS_ATTACH, нужно инициализировать вышеупомянутые переменные.



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

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

Наверх




Память: 0.47 MB
Время: 0.016 c
8-50868
Suroga
2002-01-17 20:09
2002.09.16
Озвучивание времени


3-50623
Andrew_
2002-08-21 17:00
2002.09.16
Проблема с сортировкой в ODAC


3-50648
Sub
2002-08-27 11:19
2002.09.16
Вопросы по базам данных


3-50655
firsor1
2002-08-27 12:10
2002.09.16
Чтобы использовать ShellExecute что должно быть в uses..


1-50750
torick
2002-09-05 10:48
2002.09.16
PsRBExportDevices, TExtraDevices