webForumDet fria alternativet

Refresh Desktop

2 svar · 215 visningar · startad av LR^evil.sid

LR^evil.sidMedlem sedan maj 2002560 inlägg
#1

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

LR^evil.sidMedlem sedan maj 2002560 inlägg
#2

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
LR^evil.sidMedlem sedan maj 2002560 inlägg
#3

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.

259 ms totalt · 3 externa anrop · v20260731065814-full.30151723
131 ms — hämta forumlista (db)
122 ms — hämta statistik (db)
134 ms — hämta tråd, inlägg och bilagor (db)