In deze post heb ik een wallpaper shuffler app gepost. Nu was er vraag naar om het te delen, dus wou ik dat even netjes doen door een echte Windows Service op te zetten. Vooreen draaide er een Console Application die ik liet verbergen d.m.v. ShowWindow in user32.dll. Beetje vieze methode, dus vandaar deze omslag.
Om de wallpaper te verwisselen gebruik ik de functie SystemParametersInfo:
Dit werkte in de Console Application prima. Ik heb nu de applicatie omgezet naar een Windows Service. Echter krijg ik als result 0 mee, met de volgende fout (de Win32Exception):
Als zijlijntje om toch m'n resultaat aan de gang proberen te krijgen heb ik gekeken naar een IActiveDesktop implementatie. Helaas gaf dat geen feedback, namelijk dat er geen wallpaper wordt veranderd.
Om de wallpaper te verwisselen gebruik ik de functie SystemParametersInfo:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
| [DllImport( "user32.dll", CharSet = CharSet.Auto )] private static extern Int32 SystemParametersInfo( UInt32 uiAction, UInt32 uiParam, String pvParam, UInt32 fWinIni ); private static UInt32 SPI_SETDESKWALLPAPER = 20; private static UInt32 SPIF_UPDATEINIFILE = 0x1; private static UInt32 SPIF_SENDWININICHANGE = 0x2; public void SetImage( string filename ) { int result = SystemParametersInfo( SPI_SETDESKWALLPAPER, 0, filename, SPIF_SENDWININICHANGE | SPIF_UPDATEINIFILE); if (result == 0) throw new System.ComponentModel.Win32Exception (Marshal.GetLastWin32Error( )); } |
Dit werkte in de Console Application prima. Ik heb nu de applicatie omgezet naar een Windows Service. Echter krijg ik als result 0 mee, met de volgende fout (de Win32Exception):
Dit is ook wel bekend als Windows foutcode 182. Er staat dat 'het' een bestand kan aanmaken als ik de wallpaper verander. Dan vraag ik mij af, welk bestand? Ik kan daar op geen enkele wijze achter komen. Het maakt overigens ook niet uit of ik deze Windows Service laat inloggen op mijn account (logisch, want de wallpaper is User Account gebonden), of als Local Service laat draaien. Heeft iemand hier een idee van waarom deze foutmelding wordt gegeven of hoe ik het verder kan debuggen? Google levert weinig info over deze functie op, omdat maar weinig mensen deze functie in een Windows Service zetten.-----------------------------------------------------
Sunday, February 21, 2010 7:32:14 PM
-----------------------------------------------------
Cannot create a file when that file already exists
WallpaperService
at WallpaperService.Service.SetImage(String filename)
at WallpaperService.Service.TheThread()
System.Collections.ListDictionaryInternal
Als zijlijntje om toch m'n resultaat aan de gang proberen te krijgen heb ik gekeken naar een IActiveDesktop implementatie. Helaas gaf dat geen feedback, namelijk dat er geen wallpaper wordt veranderd.