Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.45 MB
Время: 0.009 c
14-50922
bob1906
2002-08-21 02:41
2002.09.16
Как написать свою поисковую програму


1-50725
Незнайка
2002-09-05 14:27
2002.09.16
Таблицы в RichEdit


7-50987
Zlo@der
2002-06-27 15:53
2002.09.16
Как узнать серийный номер винта.


1-50772
^Sanya
2002-09-05 14:39
2002.09.16
TStringGrid:


3-50657
Nina
2002-08-26 15:13
2002.09.16
подскажие как сделать запрос!




   Наверх