Форум: "Основная";
Текущий архив: 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