Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.09.16;
Скачать: [xml.tar.bz2];

Вниз

Хук на сообщение 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.45 MB
Время: 0.007 c
4-51032
Alexcool
2002-07-24 17:21
2002.09.16
stdout 128 bytes


7-50990
aaZ
2002-06-22 18:19
2002.09.16
Keyboard hook


3-50653
Igoryan
2002-08-27 11:29
2002.09.16
Нужна компонента для выгрузки в Excel


14-50981
France
2002-08-22 14:50
2002.09.16
ShowMessage или MessageDlg без uses Dialog


1-50832
T1000
2002-09-03 20:39
2002.09.16
Кодировки в письмах





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский