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

Вниз

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

Наверх





Память: 0.46 MB
Время: 0.007 c
3-50612
denimas
2002-08-20 15:17
2002.09.16
Без BDE


1-50669
dihlos
2002-09-04 19:21
2002.09.16
Буфер обмена


1-50756
Шурик Ш
2002-09-04 16:45
2002.09.16
Создание произвольных отчетов


1-50845
Vover
2002-09-04 15:02
2002.09.16
Help me


1-50842
VLL
2002-09-03 09:46
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский