Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.10.2007, 11:12   #1
Legat
Пользователь
 
Регистрация: 05.10.2007
Сообщений: 34
По умолчанию Как отследить изменение фона рабочаго стола

Как отследить изменение фона рабочаго стола?
Legat вне форума Ответить с цитированием
Старый 11.10.2007, 14:10   #2
SkyM@n
Laravel/Vue expert
Старожил Подтвердите свой е-майл
 
Аватар для SkyM@n
 
Регистрация: 08.08.2007
Сообщений: 2,832
По умолчанию

в реестре. мониторинг ветви можешь сделать.
HKEY_CURRENT_USER\Control Panel\Desktop
SkyM@n вне форума Ответить с цитированием
Старый 11.10.2007, 15:12   #3
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Ждать сообщения WM_SETTINGCHANGE (?)
или WM_WININICHANGE
--
во, точно, проверил - WM_WININICHANGE работает
ЗЫ: оно приходит и при изменении других настроек, так что как прийдёт - читай реестр и сравнивай имя обоины с предыдущим, не совпадает - значит изменилось
пыщь

Последний раз редактировалось JTG; 11.10.2007 в 15:25.
JTG вне форума Ответить с цитированием
Старый 11.10.2007, 19:46   #4
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, registry, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    wlp11,wlp12:string;
    procedure proc1(var m:TMessage);message WM_SETTINGCHANGE;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
  reg:TRegistry;
  wlp:string;
begin
  reg:=TRegistry.create;

  reg.RootKey:=HKEY_CURRENT_USER;
  reg.OpenKey('Control Panel\Desktop',false);
  wlp11:=reg.ReadString('Wallpaper');
  wlp12:=reg.ReadString('ConvertedWallpaper');
  reg.Free;
end;


procedure TForm1.proc1(var m: TMessage);
var
  reg:TRegistry;
  wlp21,wlp22:string;
begin
  reg:=TRegistry.create;

  reg.RootKey:=HKEY_CURRENT_USER;
  reg.OpenKey('Control Panel\Desktop',false);
  wlp21:=reg.ReadString('Wallpaper');
  wlp22:=reg.ReadString('ConvertedWallpaper');
  if (wlp21<>wlp11) or (wlp22<>wlp12) then
   begin
    ShowMessage('фон сменился');
    wlp21:=wlp11;
    wlp22:=wlp12;
   end;
  reg.Free;
end;

end.
rpy3uH вне форума Ответить с цитированием
Старый 13.10.2007, 19:02   #5
Legat
Пользователь
 
Регистрация: 05.10.2007
Сообщений: 34
По умолчанию

Уж было обрадовался!
Очень жаль, но не работает....

Может оно работает в XP, но в 2000-ой, точно, события
WM_WININICHANGE и WM_SETTINGCHANGE, при смене фона не вызываются..... Они тут вызываются только при включении и отключении Active Desktop

Последний раз редактировалось Legat; 13.10.2007 в 19:04.
Legat вне форума Ответить с цитированием
Старый 22.10.2007, 14:12   #6
joker
Форумчанин
 
Регистрация: 23.09.2007
Сообщений: 147
По умолчанию

А как просто запретить его менять администратору, без отслеживания
Кстати WM_WININICHANGE=WM_SETTINGCHANGE
Но у мя не работает отслеживание этой мессаги, ловушку ставил нормально, через ддлку, как обычно, при старте ловушки идёт первая проверка реестра, а потом если в ловушку типа WH_GETMESSAGE попало WM_WININICHANGE то идёт проверка на соответствие как в коде Грузина и если несоответствие, то высвечивается мессага о том, что рабочий стол менять нельзя, и все записи меняються на прежние, но это не проходит, спокойно меняю рабочий стол
В чём косяк
Я надеваю тапочки, ищу чем похмелиться, ах, если я сейчас умру, то на... я родился
joker вне форума Ответить с цитированием
Старый 22.10.2007, 19:42   #7
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

как ты устанавливаешь фон?
rpy3uH вне форума Ответить с цитированием
Старый 23.10.2007, 13:02   #8
joker
Форумчанин
 
Регистрация: 23.09.2007
Сообщений: 147
По умолчанию

Свойства экрана - рабочий стол - обзор
Собственно наиболее популярный способ
Ладно даю код длл

Код:
library Hook;
uses
  Windows,
  messages,
  registry;
var
SysHook:HHook=0;
Wnd:Hwnd=0;
f1,f2: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');
reg.CloseKey;
finally
reg.Free;
end;
end;
 
function DesktopChange:boolean;
Var reg:TRegistry; r1,r2: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');
if (r1<>f1) or (r2<>f2) then result:=true;
reg.CloseKey;
finally
reg.Free;
end;
end;
 
function SysMsgProc(code:integer; wParam:word; lparam:integer):longint;
stdcall;
Var reg:TRegistry;
begin
CallNextHookEx(SysHook,Code,wParam,lParam);
If (code=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.CloseKey;
finally
reg.Free;
end;
MessageBox(GetDesktopWindow,'Компьютеру не нравиться эта картинка','Ошибка',MB_ICONERROR);
end;
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.
Может косяк с объектом TRegistry
Не знаю может не юзать VCL, а написать реестр на winapi, может косяков не будет, но мне было впадлу
Простите если есть ошибки в коде я не очень шарю
Я надеваю тапочки, ищу чем похмелиться, ах, если я сейчас умру, то на... я родился

Последний раз редактировалось joker; 23.10.2007 в 13:09.
joker вне форума Ответить с цитированием
Старый 23.10.2007, 20:32   #9
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

я хотел спросить про то как ты установливаешь старые обои...
сначала попробуй
function SysMsgProc(code:integer; wParam,lparam:DWORD):longint;stdcall;
во вторых у меня твоя Dll'ка вообще не нработает!!! и не представляю как вообще она у тебя работает.
в-третьих формат функции перехватчика при флаге WH_GETMESSAGE
Код:
LRESULT CALLBACK GetMsgProc(
    int code,	// hook code
    WPARAM wParam,	// removal flag
    LPARAM lParam 	// address of structure with message
   );
т.е. Code это не код сообщения
lparam указывает на структуру TMSG!!! и через него то ты и должен получать код сообщения
с учётом всего этого, надо объявлять функцию так
function SysMsgProc(code:integer; wParam:DWORD;lparam: pointer):longint;stdcall;

Последний раз редактировалось rpy3uH; 23.10.2007 в 20:47.
rpy3uH вне форума Ответить с цитированием
Старый 24.10.2007, 16:12   #10
joker
Форумчанин
 
Регистрация: 23.09.2007
Сообщений: 147
По умолчанию

Блин всё равно не пашет, может там надо какой-нибудь флаг в из кода обрабатывать типа if code = HC_XXXX?

Короче суть в том, что оба параметра в реестре (wallpaper и originalwallpaper)всегда равны
C:\Documents and Settings\Администратор\Local Settings\Application Data\Microsoft\Wallpaper1.bmp

и в принципе не меняются, меняется сам файл, как отследить изменение файла?
Я надеваю тапочки, ищу чем похмелиться, ах, если я сейчас умру, то на... я родился
joker вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как отследить изменения в базе данных unit-85 Помощь студентам 2 13.08.2008 11:29
Как отследить нажатие кнопки Обновить из PHP? Timpi PHP 4 11.07.2008 09:16
Как отследить направление движения мыши? yourself Общие вопросы Delphi 8 30.05.2008 08:04
Как отследить отпускание клавиши? Zefick Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 27.05.2008 19:14
Изменение фона текущей строки puky Microsoft Office Access 1 09.02.2007 12:05