для этой цели думал обойтись хуком WH_GETMESSAGE на сообщение WM_WININICHANGE оно же WM_SETTINGCHANGE, но как оказалось хук таинственным образом не работает. В некоторых случаях этому есть объяснение: раздел реестра не меняется а просто заменяется файл виндоусовский файл Wallpaper1.bmp (это происходит при замене на стандартную картинку), но это лишь частичный случай вот собственно код длл жду ваших замечаний Код (Text): library Hook; uses Windows, messages, registry; var SysHook:HHook=0; f1,f2,f3:string; procedure FirstCheck; Var reg:TRegistry; begin reg:=TRegistry.Create; try reg.RootKey:=HKEY_CURRENT_USER; reg.OpenKey('Control Panel\Desktop',false); f1:=reg.ReadString('Wallpaper'); f2:=reg.ReadString('ConvertedWallpaper'); f3:=reg.ReadString('OriginalWallpaper'); reg.CloseKey; finally reg.Free; end; end; function DesktopChange:boolean; Var reg:TRegistry; r1,r2,r3:string; Begin result:=false; reg:=TRegistry.Create; try reg.RootKey:=HKEY_CURRENT_USER; reg.OpenKey('Control Panel\Desktop',false); r1:=reg.ReadString('Wallpaper'); r2:=reg.ReadString('ConvertedWallpaper'); r3:=reg.ReadString('OriginalWallpaper'); if (r1<>f1) or (r2<>f2) or (r3<>f3) then result:=true; reg.CloseKey; finally reg.Free; end; end; function SysMsgProc(code:integer; wParam,lparam:longint):longint; stdcall; Var reg:TRegistry; begin if (code>0) or (wparam=0) then result:=CallNextHookEx(SysHook,Code,wParam,lParam) else If (PMsg(lparam)^.message=WM_WININICHANGE) and DesktopChange then begin reg:=TRegistry.Create; try reg.RootKey:=HKEY_CURRENT_USER; reg.OpenKey('Control Panel\Desktop',false); reg.WriteString('Wallpaper',f1); reg.WriteString('ConvertedWallpaper',f2); reg.WriteString('OriginalWallpaper',f3); reg.CloseKey; finally reg.Free; end; MessageBox(0,'Компьютеру не нравится эта картинка','Ошибка',MB_ICONERROR); end; result:=CallNextHookEx(SysHook,Code,wParam,lParam); end; procedure RunStopHook(State:boolean) export; stdcall; begin if State then begin FirstCheck; SysHook:=SetWindowsHookEx(WH_GETMESSAGE,@SysMsgProc,HInstance,0); end else begin UnhookWindowsHookEx(SysHook); SysHook:=0; end; end; exports RunStopHook index 1; begin end. Но ставить ловушку на реестр - это неуниверсальное решение Поэтому я подумал о перехвате API. От перехвата SystemParametersInfoA я и так ничего не ждал, да конечно, перехват рабочий, только вот система не этой функцией пользуется Возник вопрос есть ли какая нибудь функция в ntdll или в kernel32 которая вызывается внутри SystemParametersInfo, каковы её парамеры, да и где вообще можно достатьчто-то вроде справочника так называемых недокументированных функции-переходников с префиксом Zw
Несколько отвлечённый вопрос, но: а не греховно ли применять в хуке столь блокирующую функцию, как MessageBox?
Народ, я конечно понимаю, что вы знаете больше моего, но у меня в сообщении простые понятные вопросы, разве трудно на них ответить? если лень отвечать просто киньте ссылку на материал я например не могу найти бесплатно книгу Г. Неббета - Справочник по базовым функциям API Windows NT/2000, думаю она мне в этой теме поможет Чем так плохо использование MessageBoxа? Есть какие-то ограничения на вызов WinAPI в хуках?
гы, впервые вижу как кто то юзает HInstance по прямому назначению )) сорре, не мог не отреагировать )) ..ограничений нет, а вопросы подобные твоим на rsdn прилично категоризированы и оформлены в общем.. ..глянь(к примеру на delphi.sources.ru.. или soruces.ru/delphi..) глянь что кеддесы юзают чтобе воллпепер поменядь, отбери самых популярных способов штуки три, там увидишь на какие апихуки вешать, а на какие - просто проверка время от времени.. ..кстате можно просто из своего приложения по таймеру проверять реестр и всё на места ставить.. изврата меньше и стабильней.. и чего вас туда понесло.. ..кароче лучше найди на винте WIN32.HLP и его зофтыкай =)..
ну я [...] такой делаю всегда так: CreateThread(nil,0,Proc,params,0,HInstance); ибо не приходецо декларировать лишние 4 байта )) или еще в циклах тоже. если в процедуре декларируется var i:integer; begin то это позор! ибо [...] стока писанины ради одной i? надо еёё альтернативно заменить )) пускай даже асом фставкой! =))) ХЕК!
за ссылки спасибо насчёт изврата, прогу ишу для человека, чтобы она таким образом издевалась над своей мамой, когда сама будет в общаго, оставив на рабочем столе что-то вроде ПОХ... НА ВСЁ ага там прямо так и написано какие сообщения для ловушек ставить и как конкретно отслеживать изменения рабочего стола насчёт HINSTANCE - это надо очень ленивым быть чтобы таким образом над ним издеваться так всё таки чё насчёт перехвата, нет ли какой отдельной изначальной функции для установки новых обоев рабочего стола? почему не работают хуки, в том случае если меняешь реестр (то есть ставишь картинку не из стандартного списка)?
ага, есь! ZwUserChangeWallpaper юзай. ..прфф.. бред.. внедри дебаг уже.. ..если валлп меняется посредством перезаписи реестра, то ставь хук на апи, и обрабатывай через апи, а не tregistry.. ..всё время вспоминается как кез сказал про TFormGrabber =) //всё же не понимаю, если дело в одном лишь регистре.. то [...] регистр не править ежесекундно...?
может достаточно назначить права доступа на файл и соответствующий раздел реестра ? (запретить изменение/удаление) ибо при наличии прав хуки не помогут.
kropalik а при наличии мозга - вообще ничего не поможет ))) Так что самого элементарного - делегирования прав вполне хватит
погоди в списке экспортируемых функций ntdll я ничё подобного типа ZwUserChangeWallpaper и гугл ничё не выдал по ней и с zw и с nt префиксом? Мож её не существует или она в другой длл или по дркгому называеться?