Tjena WF. Eftersom jag gillar förändringar och lätt tröttnar på statiska värden så skapade jag ett litet program i VB.NET som byter wallpaper åt mig varje gång det körs.
Problemet är att jag inte vet om det ens är möjligt eller hur jag gör för att uppdatera skrivbordet efter att programmet körts. Annars förlorar vi ju hela poängen med programmet.
Jag vill tillägga att jag inte kan särskillt mycket om .NET utan jag lär mig allt eftersom medan jag skriver.
Finns det någon möjlighet att skicka 'refresh desktop' från mitt program?
Har kikat runt i forumet utan att hitta något som kan tänkas utföra det jag vill. Har även sökt, i två dagar nu, på microsoft.com utan att hitta någon lösning. Det är ju lite svårt att söka rätt när jag inte vet vad jag skall söka efter.
Jag hittade nånting som såg lovande ut men har inte en aning om hur jag skall använda det: IActiveDesktop::ApplyChanges
MVH
http://www.vbcity.com/
Författaren till den fetmarkerade koden skriver att bakgrundsbilden skall bytas ut men det gör den inte. Jag ser att skrivbordet blinkar till när jag kör mitt program men bilden byts inte ut förrän jag trycker F5. Kan ni se vad som är fel?
Länk till källkoden på vbcity: Force Background Reload
Imports System.IO
Public Class Form1
Inherits System.Windows.Forms.Form
#Region " Windows Form Designer generated code "
Public Sub New()
MyBase.New()
InitializeComponent()
End Sub
[b]Public Declare Function SystemParametersInfo Lib "user32" Alias "SystemParametersInfoA" (ByVal uAction As Long, _
ByVal uParam As Long, _
ByVal lpvParam As String, _
ByVal fuWinIni As Long) As Long
Public Const SPI_SETDESKWALLPAPER = 20
Public Const SPIF_UPDATEINIFILE = &H1
Public Const SPIF_SENDWININICHANGE = &H2[/b]
<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
Me.ClientSize = New System.Drawing.Size(104, 0)
Me.Name = "Form1"
Me.Opacity = 0
Me.ShowInTaskbar = False
Me.WindowState = FormWindowState.Minimized
End Sub
#End Region
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
CopyImage()
End Sub
[b]Function ChangeWallpaper(ByVal Filename As String)
SystemParametersInfo(SPI_SETDESKWALLPAPER, 0&, Filename, SPIF_UPDATEINIFILE Or SPIF_SENDWININICHANGE)
End Function[/b]
Private Sub CopyImage()
Dim ArrVars(2)
ArrVars(0) = "c:\desktopimages\"
ArrVars(1) = "c:\desktopimages\collection\"
ArrVars(2) = "\desktopimager.jpg"
Dim Dir As Directory
If File.Exists(Dir.GetCurrentDirectory & "\config.cfg") Then
Dim SR As StreamReader = New StreamReader(Dir.GetCurrentDirectory & "\config.cfg")
Dim StrCfg As String = Trim(SR.ReadLine) : SR.Close()
If Int(Len(StrCfg)) = 0 Then File.Delete(Dir.GetCurrentDirectory & "\config.cfg") : GoTo NoCfg
If Dir.Exists(StrCfg) Then : ArrVars(1) = StrCfg
Else
If Dir.Exists(Mid(StrCfg, 1, 2)) And Not Int(Len(StrCfg)) = 2 Then
Dir.CreateDirectory(StrCfg)
ArrVars(1) = StrCfg
End If
End If
End If
NoCfg:
If Dir.Exists(ArrVars(0)) Then
DirExists:
If Dir.Exists(ArrVars(1)) Then
CollectorExists:
Dim ArrFiles = Dir.GetFiles(ArrVars(1), "*.jpg")
If Int(UBound(ArrFiles)) > -1 Then
Randomize()
File.Copy(ArrFiles(Int(Rnd() * (UBound(ArrFiles) + 1))), ArrVars(0) & ArrVars(2), True)
End If
Else
Dir.CreateDirectory(ArrVars(1)) : GoTo CollectorExists
End If
Else
Dir.CreateDirectory(ArrVars(0)) : GoTo DirExists
End If
[b]ChangeWallpaper("c:\desktopimages\desktopimager.jpg")[/b]
Application.Exit()
End Sub
End Class
Jag fortsatte söka och fann då en annan sida på vbcity.com Efter lite pillande blev resultatet detta:
Imports System
Imports System.IO
Imports System.Drawing
Imports System.Windows.Forms
Public Class Form1
Inherits System.Windows.Forms.Form
#Region " Windows Form Designer generated code "
Public Sub New()
MyBase.New()
InitializeComponent()
End Sub
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub
Public Declare Function SystemParametersInfo Lib "user32" Alias "SystemParametersInfoA" (ByVal uAction As Long, _
ByVal uParam As Long, _
ByVal lpvParam As String, _
ByVal fuWinIni As Long) As Long
Public Const SPI_SETDESKWALLPAPER = 20
Public Const SPIF_UPDATEINIFILE = &H1
Public Const SPIF_SENDWININICHANGE = &H2
Public Const SPIF_SENDCHANGE = 0
Private components As System.ComponentModel.IContainer
<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
'
'Form1
'
Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
Me.ClientSize = New System.Drawing.Size(292, 273)
Me.Name = "Form1"
Me.Text = "Form1"
End Sub
#End Region
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
ChangeWallPaper(RandomImageFile())
End Sub
Private Function RandomImageFile() As String
Dim ArrVars(2)
ArrVars(0) = "c:\desktopimages\collection\"
ArrVars(1) = "\config.cfg"
Dim Dir As Directory
Dim ArrFiles = Dir.GetFiles(ArrVars(0).ToLower(), "*.jpg")
If Int(UBound(ArrFiles)) > -1 Then
Randomize()
RandomImageFile = ArrFiles(Int(Rnd() * (UBound(ArrFiles) + 1))).ToString()
End If
End Function
Private Sub ChangeWallPaper(ByVal FileName As String)
If FileName.Trim = "" Then Exit Sub
If FileName.LastIndexOf(".bmp") <> -1 Then
Dim myImage As Image = Image.FromFile(FileName, True)
FileName = FileName.Substring(0, FileName.IndexOf(".")) & ".jpg"
myImage.Save(FileName, Imaging.ImageFormat.Jpeg)
myImage.Dispose()
End If
If File.Exists(FileName) Then
SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, FileName, SPIF_UPDATEINIFILE)
SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, FileName, SPIF_SENDCHANGE)
ElseIf Not File.Exists(FileName) Then
MessageBox.Show("File Not Found", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
End If
Application.Exit()
End Sub
End Class
Det fungerar dock inte och bilden bytes inte ut. Jag försår inte varför det inte fungerar.