meta dati per questa pagina
WallPaper Randomizer 3.5.0.4
I tempi corrono ed a volte qualche momento si trova, ergo ho pensato di riscrivere il programmetto in C# e WPF con lo scopo principale di vedere come funziona WPF.
Ovviamente l'xaml (il metalinguaggio per la descrizione delle finestre) e' bello, potente, altamente espandibile ma, attualmente, non c'e' la varieta' di controlli esistenti in WinForms.
1. Impostazione Wallpaper supponevo che in .NET ci fosse un namespace, una classe riferita allo schermo che permettesse l'impostazione diretta del wallpaper. Mai supposizione fu piu' errata. L'impostazione avviene con la buon vecchia API SystemParametersInfo ergo va' importata ed ho quindi creato una classe apposita:
public class SPI { [DllImport("user32.dll", CharSet = CharSet.Auto)] private static extern int SystemParametersInfo(int uAction, int uParam, string lpvParam, int fuWinIni); private const int SPIF_UPDATEINIFILE = 0x1; private const int SPI_SETDESKWALLPAPER = 20; private const int SPIF_SENDWININICHANGE = 0x2; public static int setWallpaper(string fileName) { return SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, fileName, SPIF_SENDWININICHANGE | SPIF_UPDATEINIFILE); } }
Come potete notare la SystemParameterInfo viene richiamata sia con il parametro SPIF_SENDWININICHANGE che con SPIF_UPDATEINIFILE questo per aggiornare immediatamente sia lo schermo che il registry.
2. Recuperare il wallpaper corrente il file utilizzato viene salvato sul registry alla voce HKCU\Control Panel\Desktop\WallPaper. In questo caso esiste nel framework la classe RegistryKey nel namespace Microsoft.Win32 che permette, appunto di leggere e scrivere sul registry stesso, sono quindi bastanti le seguenti righe di codice per ottenere il file:
RegistryKey rkWallPaper = Registry.CurrentUser.OpenSubKey("Control Panel\\Desktop", false); string WallpaperPath = rkWallPaper.GetValue("WallPaper").ToString(); rkWallPaper.Close();
da assegnare poi all'oggetto Image presente nella finestra con:
imgWall.Source = (ImageSource)new ImageSourceConverter().ConvertFrom(new Uri(WallPaperPath)));
3. Icona nella systray WPF non ha un oggetto per inserire icone nella systray e stavo quasi pensando di dover utilizzare le API quando ho controllato nel namspace System.Windows.Forms. Il namespace in questione contiene, appunto, un oggetto adatto che, guarda caso, si chiama NotifyIcon che e' molto semplice da utilizzare ed al quale imposteremo il relativo menu' contestuale.
4. Messaggio col nome del wallpaper utilizzato. Nella vecchia versione VB6 per il messaggio avevo utilizzato una banale form senza bordi visualizzata in basso a destra, senza alcun riferimento all'icona nella systray. L'oggetto NotifyIcon espone un metodo molto utile a riguardo che mostra un Baloon con il messaggio che c'interessa quindi basta richiamarlo col codice:
notifyIcon.ShowBalloonTip(10000, Title, file.Substring(file.LastIndexOf('\\') + 1), ToolTipIcon.Info);
dove i parametri indicano rispettivamente il tempo di timeout per la scomparsa del baloon, il titolo, il messaggio ed il tipo di icona da utilizzare nel baloon stesso (nessuna, info, warning, errore).
5. Timer Ogni applicazione WPF si compone di almeno 2 thread: una di gestione ed una, gestita direttamente da WPF per il rendering ed il repainting. Questo cosa significa? In pratica il thread di gestione ospita un oggetto Dispatcher che mantiene una coda di operazioni da fare sull'interfaccia che il render thread si occupera' di effettuare.
Ovviamente questo significa che dato che il timer standard che si trova in System.Timers non funziona correttamente ma, fortunatamente, nel namespace System.Windows.Threading e' presente l'apposita classe DispatcherTimer.
Download
Il software e' rilasciato con licenza GPL.
| Versione Corrente 3.5.0.4 | Binari (10 KB) | Sorgenti (13 KB) |
|---|
ChangeLog
| 3.5.0.4 del 08/03/2012 |
|---|
| Aggiunta controllo "stesso" wallpaper |
| 3.5.0.3 del 21/11/2011 |
| Aggiunta la possibilità di scegliere se visualizzare o meno il baloon informativo |
| 3.5.0.2 del 23/09/2010 |
| Aggiunta visualizzazione Info (se presente file "nome immagine.txt") |
| Aggiunta ricerca su google.it di "nome immagine" |
| 3.5.0.1 del 14/05/2010 |
| Rilascio iniziale |
Vecchie Versioni
| Versione Corrente 3.5.0.3 | Binari (11 KB) | Sorgenti (13 KB) |
|---|---|---|
| Versione 3.5.0.2 | Binari (10 KB) | Sorgenti (14 KB) |
| Versione 3.5.0.1 | Binari (9 KB) | Sorgenti (14 KB) |
— KillerBoy 14/05/2010 14:37:59
WallPaper Randomizer
Questo e' un programmetto che ho scritto un bel po' di tempo fa, intorno al 2001 non ricordo di preciso e che, in 5 minuti di pausa in ufficio con VB6, ogni tanto ho modificato/corretto/aggiunto funzionalita' ma che comunque io uso personalmente da un bel po'.
In realta' non fa altro che modificare il wallpaper a tempo, l'intervallo e' libero.
Le immagini vengono prese da una cartella impostabile a piacere.
Il "counter" e' la discriminante di randomizzazione: piu' e' alta piu' immagini vengono prese in considerazione piu' e' bassa meno immagini vengono considerate.