C# - Asztal hátterének módosítása

forráskód letöltése
A Windows operációs rendszer számtalan olyan tulajdonsággal rendelkezik, melynek lekérdezéséhez, illetve módosításához nem áll rendelkezésre .NET kínálta metódus. Ennek – a Microsoft saját bevallása szerint – csak egy oka van: a fejlesztőknek nem volt elég ideje minden API függvényt implementálni. De szerencsére megadták annak lehetőségét, hogy ezeket a függvényeket menedzselt kódból is elérjük. Így teszünk cikkünkben is annak érdekében, hogy megváltoztassuk egy függvény segítségével a Windows Asztalának háttérképét.
A szükséges függvény a SystemParametersInfo nevet viseli, és a háttérkép megváltoztatásán túl még számtalan rendszerparaméter lekérdezhető, illetve módosítható a segítségével. A függvény szintaxisa a következő:
SystemParametersInfo
BOOL SystemParametersInfo(
UINT uiAction,
UINT uiParam,
PVOID pvParam,
UINT fWinIni
);
A függvény segítségével lekérdezhetőek, illetve beállíthatóak olyan rendszerparaméterek, melyek vagy a megjelenést, vagy egyéb – látható eredmény nélküli – funkcionalitást befolyásolnak.
Paraméterek
UINT uiAction
Egy konstans egész értékkel jelezhetjük, hogy milyen műveletet szeretnénk elvégezni az adott tulajdonság tekintetében. Az Asztal háttérképének módosítása érdekében a SPI_SETDESKWALLPAPER konstanst kell megadni, melynek értéke 20.
UINT uiParam
Ennek értéke attól függ, hogy milyen műveletet adunk meg az első paraméterben. Ez azt jelenti, hogy más érték, illetve változó kerül ebbe a paraméterbe. Előfordul olyan művelet, melynél egy struktúra lesz itt megadva. Az MSDN felhasználásával lehet tájékozódni arról, hogy a kiválasztott művelethez milyen értéket kell ebben a változóban megadni. A fenti művelet elvégzéséhez ennek értéke 0.
PVOID pvParam
Értéke szintén a művelettől függ. A háttérkép módosításakor az új kép elérési útvonala kerül ebbe a változóba, egy karakterlánc formájában.
UINT fWinIni
A művelet lehet lekérdezés, vagy módosítás, ahogy említettük. Amennyiben módosítás történt egy rendszerparaméterben (mint amilyen a háttérkép mivolta), akkor eldöntésre kerül, hogy a felhasználói profilt érintette-e a változás. Amennyiben igen, akkor minden ablak kap egy WM_SETTINGCHANGE üzenetet, értesítendő az adott alkalmazást a módosítás megtörténtéről.
A paraméter értéke lehet nulla, ha nem akarjuk, hogy a változás érintse a felhasználói profilt, vagy ha nem akarjuk, hogy az összes ablak megkapja a fenti üzenetet. Amennyiben a felhasználói profil módosítását is szeretnénk elérni, akkor a SPIF_UPDATEINIFILE konstanst kell itt megadni (értéke 0x1), amennyiben az üzenetküldést is szeretnénk, akkor a SPIF_SENDWININICHANGE konstans (értéke 0x2) megadása szükséges. A két konstans kombinálható is.
Visszatérési érték
Amennyiben a függvény hívása, és a művelet végrehajtása sikeres volt, akkor a visszatérési érték egy nullától eltérő szám.
A példaprogramunkban egy ComboBox kontrolban adjuk meg a háttérként megadható képek listáját, melyeket az alkalmazás mappájában, a WALLPAPERS alkönyvtárba helyeztünk el. Ezek a képek egyébként a Windows mappájában találhatók.
Az API függvény könnyebb meghívása érdekében létrehoztunk egy osztályt, melynek neve APIClass, ebben definiáltunk egy metódust a függvényhíváshoz. Az API függvény az osztály egy statikus függvénye lesz.
[DllImport("User32.dll", CharSet=CharSet.Auto)]
private static  extern int SystemParametersInfo (int uiAction , int uiParam ,string pvParam , int fWinIni);
A SetWallPaper metódusban pedig meghívjuk a függvényt, a kívánt kép elérési útvonalát megadva paraméterként.
public static void SetWallPaper(string wp)
{
  SystemParametersInfo(20,0,wp,0x1|0x2);
}
A függvény negyedik paraméterében megadtuk, hogy mind a felhasználói profilt érintő módosítás, mind pedig az üzenet „broadcast” történjen meg.
A MŰVELET gomb megnyomása után egyszerűen meghívjuk a metódust a kívánt értékkel. Amennyiben a listából a „Nincs háttér” elem kerül kiválasztásra, akkor nem töltődik be kép az Asztal háttereként, csupán a jól ismert kék háttér lesz látható. Ezt úgy érjük el, hogy egy üres karakterláncot adunk meg a harmadik paraméterben.
string wp = "";
APIClass.SetWallPaper(wp);