Wallies is ready !
Wallies ??? quoi c’est
Alors, en fait Wallies, qu’est ce que c’est ? C’est un programme en .NET qui permet de gérer un slideshow des fonds d’écran (oui, ça existe déjà) mais en multiscreen (là déjà moins, ou alors payant).
Ca a commencé lors de mon achat d’un 2ème écran. 2 écrans c’est bien, mais on trouve beaucoup moins de fond d’écran en 3840*1200 qu’en 1920*1200 (et les fond d’écrans monochromes sont pas pour moi)! Certes, on en trouve quand même mais le choix est limité. J’ai donc commencé à les faire moi même mais j’avoue que le résultat est pas tiptop, et yen a toujours peu.
C’est là que Wallies est arrivé (^^). En fait Wallies est un petit programme qui va permettre d’afficher un fond d’écran par écran avec une fréquence de mise à jour.
J’ai un dossier qui contient énormément de photos/images que j’aime bien avoir en fond d’écran. Wallies va piocher 2 images dans ce dossier et en afficher une par écran.
Il se met dans la barre systray de Windows et va effectuer un changement de fond d’écran (comme le slideshow de Windows) toutes les 10 minutes (sachant que ce paramètres peu être changé)
Il prend 2 paramètres qui sont stockés dans le fichier .config avec le programme :
- rootPathWallies : chemin d’accès aux différentes images
- imageMergedPath : chemin d’enregistrement du fond d’écran recomposé
Le programme en lui même est basique, mais il fait ce qu’on lui demande et depuis, mes 2 écrans sont contents ^^
Utilisation de Wallies
Une fois lancé, il apparait donc dans le systray et permet d’effectuer 3 actions :
- Sync Now : lance instantanément la modification des fonds d’écran
- Change Interval : permet de définir une nouvelle fréquence de changement de fond d’écran automatique (de base = 10 minutes)
- Exit : quitte l’application
Changement de fréquence
Les binaires
Le programme est composé de 3 fichiers :
- favicon.ico : icone qui sera utilisé pour le systray
- wallies.exe : l’exécutable
- wallies.exe.config : fichier de configuration
Vous pouvez télécharger les binaires Windows ici :
Mot de passe d’archive : cd3
Le code
Le programme est composé de peu de chose, une form et un module.
Je vous met le code directement ici :
mdl_Main.vb
Imports System.Diagnostics
Imports System.Text
Imports System.IO
Public Module modMain
Public Structure structWallies
Dim imageLeft As Image
Dim imageRight As Image
Dim imageLeftPath As String
Dim imageRightPath As String
End Structure
Public notIcon As NotifyIcon
Public WithEvents contMenu As ContextMenu
Public WithEvents mobTimer As Timers.Timer
Public intervalTimer As Integer = 600000 ' in ms
Public wallies As New structWallies()
Public rootPathWallies As String = My.Settings.rootPathWallies
Public imageMergedPath As String = My.Settings.imageMergedPath
Public Declare Function SystemParametersInfo Lib "user32" Alias "SystemParametersInfoA" (ByVal uAction As Integer, ByVal uParam As Integer, ByVal lpvParam As String, ByVal fuWinIni As Integer) As Integer
Public Const SPI_SETDESKWALLPAPER = 20
Public Const SPIF_UPDATEINIFILE = &H1
Public Sub Main()
Try
' Création de l'icone de systray
notIcon = New NotifyIcon()
notIcon.Visible = False
contMenu = New ContextMenu()
contMenu.MenuItems.Add(New MenuItem("Sync Now", New EventHandler(AddressOf SyncWallies))
contMenu.MenuItems.Add(New MenuItem("Change Interval", New EventHandler(AddressOf ChangeInterval))
contMenu.MenuItems.Add("-")
contMenu.MenuItems.Add(New MenuItem("Exit", New EventHandler(AddressOf ExitWallies))
notIcon.ContextMenu = contMenu
notIcon.Icon = New Icon("favicon.ico")
contMenu.MenuItems(0).Enabled = True
contMenu.MenuItems(1).Enabled = True
contMenu.MenuItems(2).Enabled = True
' Initialisation du timer
SetUpTimer(intervalTimer)
notIcon.Visible = True
' Lancement de l'app
Application.Run()
Catch obEx As Exception
Throw obEx
End Try
End Sub
Public Sub SyncWallies()
Try
' Récupération de 2 images en aléatoire
pickWallies(rootPathWallies)
' Création de l'objet qui va recevoir l'assemblage des 2 images
Dim myGraphic As System.Drawing.Graphics = Nothing
Dim m As New Bitmap(3840, 1200)
Dim destRectLeft As New Rectangle(0, 0, 1920, 1200)
Dim destRectRight As New Rectangle(1920, 0, 1920, 1200)
' Construction de l'assemblage
myGraphic = System.Drawing.Graphics.FromImage(m)
myGraphic.DrawImage(wallies.imageLeft, destRectLeft)
myGraphic.DrawImage(wallies.imageRight, destRectRight)
myGraphic.Save()
' Sauvegarde en jpg pour que Windows puisse lire le fond d'écran
m.Save(imageMergedPath, System.Drawing.Imaging.ImageFormat.Jpeg)
' Réinitialisation du fonc d'écran de Windows
SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, imageMergedPath, SPIF_UPDATEINIFILE)
' Destruction des objets pour libération mémoire
wallies.imageLeft.Dispose()
wallies.imageLeftPath = Nothing
wallies.imageRight.Dispose()
wallies.imageRightPath = Nothing
myGraphic.Dispose()
m.Dispose()
destRectLeft = Nothing
destRectRight = Nothing
Catch obEx As Exception
Throw obEx
End Try
End Sub
Public Sub ChangeInterval()
' Appel de la form de changement d'interval
Try
frm_IntervalTimer.Show()
Catch obEx As Exception
Throw obEx
End Try
End Sub
Public Sub ExitWallies()
' Fermeture de l'application, suppression de l'icone de notification
Try
notIcon.Visible = False
notIcon.Dispose()
Application.Exit()
Catch obEx As Exception
Throw obEx
End Try
End Sub
Public Sub pickWallies(ByVal path)
Try
Dim objFolder As DirectoryInfo = New DirectoryInfo(path)
Dim r As New Random(System.DateTime.Now.Millisecond)
Dim colWallies As New ArrayList
Dim tmpLeft, tmpRight As String
' Parcours du dossier racine pour listing des fichiers
For Each wally As FileInfo In objFolder.GetFiles("*.jpg")
' On remplit une liste avec les fichiers
colWallies.Add(wally.FullName)
Next
' Première génération alétoire
tmpLeft = colWallies.Item(r.Next(0, colWallies.Count)
wallies.imageLeft = Image.FromFile(tmpLeft)
wallies.imageLeftPath = tmpLeft
' Deuxième générataion aléatoire
tmpRight = colWallies.Item(r.Next(0, colWallies.Count)
' Vérification pour éviter 2 fois le même fond d'écran
Do Until (tmpRight <> tmpLeft)
tmpRight = colWallies.Item(r.Next(0, colWallies.Count)
Loop
wallies.imageRight = Image.FromFile(tmpRight)
wallies.imageRightPath = tmpRight
' Destruction des objets
objFolder = Nothing
r = Nothing
colWallies = Nothing
tmpLeft = Nothing
tmpRight = Nothing
Catch obEx As Exception
Throw obEx
End Try
End Sub
Public Sub SetUpTimer(ByVal interval As Integer)
' Définition de l'objet timer qui permet de scheduler le changement de fond d'écran tous les x
Try
mobTimer = New Timers.Timer()
With mobTimer
.AutoReset = True
.Interval = interval ' en millisecond
.Start()
End With
Catch obEx As Exception
Throw obEx
End Try
End Sub
Public Sub mobTimer_Elapsed(ByVal sender As Object, ByVal e As System.Timers.ElapsedEventArgs) Handles mobTimer.Elapsed
' A la fin du temps imparti, on relance le changement de fond d'écrans
Try
SyncWallies()
Catch obEx As Exception
Throw obEx
End Try
End Sub
End Module
frm_IntervalTimer.vb
Public Class frm_IntervalTimer
Private Sub IntervalTimer_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
NumericUpDown1.Value = modMain.mobTimer.Interval / 60000
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
modMain.SetUpTimer(NumericUpDown1.Value * 60000)
Me.Dispose()
End Sub
End Class
Sinon, voici les sources (Visual Studio 2010) en fichier zip :
Mot de passe d’archive : cd3