[Delphi-API] Windows message wallpaper change

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • MisterE
  • Registratie: April 2002
  • Laatst online: 22-07 18:41
ik wil weten wanneer de wallpaper veranderd word.(niet hoe je de wallpaper moet 'setten')
Tot zover kom ik maar het werkt alleen niet...
iemand een id?


private
{ Private declarations }
procedure WM_WallpaperChange(var Message:TWMSettingChange); message WM_SETTINGCHANGE;



procedure TForm1.WM_WallpaperChange2(var Message:TWMSettingChange);
begin
if (Message.Msg = SPI_SETDESKWALLPAPER) then
ShowMessage('Wallpaper changed');
end;

Acties:
  • 0 Henk 'm!

  • Delphi32
  • Registratie: Juli 2001
  • Laatst online: 22:42

Delphi32

Heading for the gates of Eden

Als je een breakpoint zet op de eerste regel (de if) in de procedure en je verandert runtime je wallpaper, stopt ie dan? Zo niet dan wordt de message dus niet ondervangen (of niet verzonden in de eerste plaats natuurlijk :))
Verder viel me in de SDK documentatie op dat de SPI_SETDESKWALLPAPER in de wParam gezet wordt, dat is volgens mij niet hetzelfde als Message.Msg. Die is nl WM_SETTINGCHANGED. Volgens mij zou het moeten zijn:
code:
1
if Message.wParam = SPI_SETDESKWALLPAPER then...

HTH...

Acties:
  • 0 Henk 'm!

  • Kool
  • Registratie: September 1999
  • Niet online
Als je Delphi 6 draait, werp dan een blik op de OnSettingChange event van TApplicationEvents. (hint: SPI_SETDESKWALLPAPER)
:7

Acties:
  • 0 Henk 'm!

  • MisterE
  • Registratie: April 2002
  • Laatst online: 22-07 18:41
als ik het varander:

procedure TForm1.WM_WallpaperChange(var Message:TWMSettingChange);
begin
ShowMessage('dus');

if (Message.Flag = SPI_SETDESKWALLPAPER) then
ShowMessage('Wallpaper changed');
end;


ik krijg wel de message 'dus' te zien, dus hij ontvangt wel wat. Volgens mij moet 'flag' goed zijn, want dat had ik in de win32hlp gelezen.


ook dit werkt niet:

{ Private declarations }
procedure WM_SETTINGCHANGE2(var Message:TMessage); message WM_SETTINGCHANGE;


procedure TForm1.WM_SETTINGCHANGE2(var Message:TMessage);
begin
if message.WParam = SPI_SETDESKWALLPAPER then
ShowMessage('Wallpaper changed');
end;

snap er niet meer van....doe ik iets fout of zend windows dit per user ofzo???

Acties:
  • 0 Henk 'm!

  • MisterE
  • Registratie: April 2002
  • Laatst online: 22-07 18:41
is dat OnSettingChange een ingekapselde API messages 'catcher' ?? Heb daar not nooit mee gewerkt....

Acties:
  • 0 Henk 'm!

  • Kool
  • Registratie: September 1999
  • Niet online
Jep... Is gewoon een wrapper om een zootje winapi messages. Wel handig hoor.

Wat er trouwens mis gaat bij jou api-call, is dat je de Message parameter in die procedure moet typecasten naar het type message wat je wilt hebben.

dus

procedure TForm1.WM_SETTINGCHANGE2(var Message:TMessage);
begin
if TWMSETTINGCHANGE(message).WParam = SPI_SETDESKWALLPAPER then
ShowMessage('Wallpaper changed');
end;

enz.

:z

Acties:
  • 0 Henk 'm!

  • MisterE
  • Registratie: April 2002
  • Laatst online: 22-07 18:41
goed van die typecasting voor die calls had ik nog niet gehoord....maareh hebit geprobeerd maar het werkt nog steeds niet (iig op XP)

maarja, denk dat het typecasten eigenlijk precies hetzelfde is als met wat ik in het begin had.
btw: ik gebruik bijna dezelfde manier om een 'workarea' change the 'catchen' en dat werkt wel en is ook een systemparametersinfo call.

btw: dat OnSettingChange is ook compatible met linux?? dat zal ook wel een soort api messages hebben ?

Acties:
  • 0 Henk 'm!

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 23:51

Tomatoman

Fulltime prutser

Een WM_SETTINGCHANGE message wordt alleen verstuurd door Windows als SystemParametersInfo door een proces wordt aangeroepen met SPIF_SENDCHANGE of SPIF_SENDWININICHANGE als waarde voor de fWinIni parameter. Sommige programma's houden zich daar niet aan, zodat je geen WM_SETTINGCHANGE message ontvangt.

Je moet trouwens een regel toevoegen:
code:
1
2
3
4
5
6
7
procedure TForm1.WM_WallpaperChange(var Message: TWMSettingChange);
begin
  ShowMessage('dus');
  if (Message.Flag = SPI_SETDESKWALLPAPER) then
    ShowMessage('Wallpaper changed');
  Message.Result := 0;            <--- deze regel toevoegen
end;

Een goede grap mag vrienden kosten.


Acties:
  • 0 Henk 'm!

  • MisterE
  • Registratie: April 2002
  • Laatst online: 22-07 18:41
ik verander de wallpaper in deze voorbeelden met windows zelf.

als ik dit gebruik:

procedure TForm1.WM_WallpaperChange(var Message:TWMSettingChange);
begin
ShowMessage('dus');
end;

dan geeft ie wel een showmessage uit, dus windows zend wel wat.....

Acties:
  • 0 Henk 'm!

  • Kool
  • Registratie: September 1999
  • Niet online
Hmmm... ik snap er geen klap van. Die Flag is altijd 0, terwijl ie een ander getal zou moeten zijn bij een verandering van wallpaper. Dus kun je het ook niet opvangen. Vaag. :?

Acties:
  • 0 Henk 'm!

  • MisterE
  • Registratie: April 2002
  • Laatst online: 22-07 18:41
SPI_SETDESKWALLPAPER is toch gewoon cardinal en zou dan toch een waarde moeten krijgen, is toch een nummer aan gekoppeld?

kan iemand testen of het in vb/c wel werkt ?? ik heb de ballen verstand hiervan, en met VB mnoet je de API's declareren en daar begrijp in ook niet veel van.

Dan toch maar liever delphi :)
Pagina: 1