Desktophindergrund ändern

  • VB.NET

Es gibt 27 Antworten in diesem Thema. Der letzte Beitrag () ist von Niko Ortner.

    Desktophindergrund ändern

    Ich versuche momentan mit meinem programm den desktop hintergrund zu ändern. leider funktioniert das nicht :/

    VB.NET-Quellcode

    1. Dim img As Bitmap
    2. Private Declare Function SystemParametersInfo Lib "user32" Alias "SystemParametersInfoA" (ByVal uAction As Integer, ByVal uParam As Integer, ByVal pncMetrics As String, ByVal fuWinIni As Integer) As Integer
    3. Private Const SPI_SETDESKWALLPAPER = 20
    4. Private Const SPIF_SENDWININICHANGE = &H2
    5. Private Const SPIF_UPDATEINIFILE = &H1



    VB.NET-Quellcode

    1. img = Bitmap.FromFile(ListView1.SelectedItems(0).SubItems(1).Text)
    2. If settings.GroupBox2.Enabled = True Then
    3. Dim bmp1 As Bitmap = New Bitmap(img, settings.TextBox1.Text, settings.TextBox2.Text)
    4. bmp1.Save(My.Computer.FileSystem.SpecialDirectories.Temp & "\Backup", System.Drawing.Imaging.ImageFormat.Png)
    5. SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, My.Computer.FileSystem.SpecialDirectories.Temp & "\Backup.png)", SPIF_UPDATEINIFILE Or SPIF_SENDWININICHANGE)
    6. Else
    7. End If


    es kommt keine fehlermeldung,sondern es passiert einfach nichts
    Kannst Du bitte mal den Code so formatieren, dass man ihn lesen kann (Zeilenumbrüche einfügen)?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Gib bitte mal Deinem Projekt Option Strict On
    oder was soll

    VB.NET-Quellcode

    1. Dim bmp1 As Bitmap = New Bitmap(img, settings.TextBox1.Text, settings.TextBox2.Text)
    :?:
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Sieh dir an was du speicherst

    VB.NET-Quellcode

    1. My.Computer.FileSystem.SpecialDirectories.Temp & "\Backup"


    und was du lädst

    VB.NET-Quellcode

    1. My.Computer.FileSystem.SpecialDirectories.Temp & "\Backup.png)"


    auch beim Proggen den Kopf eingeschaltet lassen =)

    wamborambo schrieb:

    was bewirkt option strict on ?

    Es sorgt dafür, dass Du die Bitmap ordentlich erstellst und nicht
    New Bitmap(img, "Roulladen", "Rotkraut")
    aufrufen musst.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    wamborambo schrieb:

    was ist denn daran falsch

    VB.NET-Quellcode

    1. Public Sub New(ByVal original As System.Drawing.Image, ByVal width As Integer, ByVal height As Integer)
    die Parameter.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Momentan ohne Option Strict on, da ich gerade nicht genau durchblicke, wie das mit den Parametern gemeint ist. ^^



    VB.NET-Quellcode

    1. img = Bitmap.FromFile(ListView1.SelectedItems(0).SubItems(1).Text)
    2. Dim bmp1 As Bitmap = New Bitmap(img, settings.TextBox1.Text, settings.TextBox2.Text) 'Breite und Höhe
    3. bmp1.Save(My.Computer.FileSystem.SpecialDirectories.Temp & "\" & ListView1.FocusedItem.Text & ".png")
    4. SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, My.Computer.FileSystem.SpecialDirectories.Temp & "\" & ListView1.FocusedItem.Text & ".Png", SPIF_UPDATEINIFILE Or SPIF_SENDWININICHANGE)


    das geänderte bild wird ohne probleme erstellt, doch der hintergrund wird einfach nicht geändert :S
    Option Strict On
    Dies läuft:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Declare Function SystemParametersInfo Lib "user32" Alias "SystemParametersInfoA" (ByVal uAction As Integer, ByVal uParam As Integer, ByVal pncMetrics As String, ByVal fuWinIni As Integer) As Integer
    3. Private Const SPI_SETDESKWALLPAPER As Integer = 20
    4. Private Const SPIF_SENDWININICHANGE As Integer = &H2
    5. Private Const SPIF_UPDATEINIFILE As Integer = &H1
    6. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    7. Dim img As New Bitmap("C:\Temp\xxx\xxx.JPG")
    8. If True Then
    9. Dim bmp1 As Bitmap = New Bitmap(img, 400, 300)
    10. Dim path As String = "c:\temp\xxx\yyy.bmp"
    11. bmp1.Save(path, System.Drawing.Imaging.ImageFormat.Bmp)
    12. SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, path, SPIF_UPDATEINIFILE Or SPIF_SENDWININICHANGE)
    13. Else
    14. End If
    15. End Sub
    16. End Class
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Option Strict on ist jetzt drin

    leider bekomme ich jetzt immer ein fehler
    Allgemeiner Fehler in GDI+.


    VB.NET-Quellcode

    1. Dim img As New Bitmap(ListView1.SelectedItems(0).SubItems(1).Text)
    2. If True Then
    3. Dim breite As Integer = CInt(settings.TextBox1.Text)
    4. Dim höhe As Integer = CInt(settings.TextBox2.Text)
    5. Dim bmp1 As Bitmap = New Bitmap(img, breite, höhe)
    6. Dim path As String = "c:\temp\" & ListView1.FocusedItem.Text & ".bmp"
    7. bmp1.Save(path, System.Drawing.Imaging.ImageFormat.Bmp) ' Hier kommt immer der Fehler
    8. SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, path, SPIF_UPDATEINIFILE Or SPIF_SENDWININICHANGE)
    9. Else
    10. End If
    @wamborambo:
    Option Strict On
    Ist Dir schon mal aufgefallen, dass man in eine TextBox auch (wie von RodFromGermany geschrieben) "Roulladen" eingeben kann? "Roulladen" ist eine Zeichenfolge (String).
    Der Konstruktor der Bitmap Klasse erwartet als Höhe und Breite aber Argumente vom Typ Integer. Das sind 32-Bit Ganzzahlen mit Vorzeichen.

    Denk mal genau darüber nach:
    Eine 32-Bit Ganzzahl kann Zahlen von -2147483648 bis 2147483647 fassen. Wenn Du im Programm eine Integer-Variable hast, dann macht die genau 4 Byte im Arbeitsspeicher aus (1 Byte = 8 Bit -> 4 Byte = 32 Bit).
    Eine Zeichenfolge ist eine Folge von Bytes (gehen wir mal von ASCII aus), die ihrerseits ein Zeichen darstellen. Wenn Du in eine TextBox "Roulladen" eingibst, dann ergibt das im Arbeitsspeicher eine Folge von diesen Bytes: {82, 111, 117, 108, 108, 97, 100, 101, 110}.
    Und jetzt der große Sprung, den es zu verstehen gilt:
    Wenn Du eine Integer-Variable hast, die den Wert 12345 hat, dann ergibt das im Arbeitsspeicher diese 4 Bytes: {0, 0, 48, 57} bzw. binär dargestellt:
    (1)

    Quellcode

    1. 00000000 00000000 00110000 00111001

    Das ist ein (singular) Objekt!
    Damit kann der Computer rechnen (z.B. kann er 1 dazuaddieren).
    Wen Du aber eine String-Variable hast, in der "12345" steht, dann wird jedes der Zeichen, entsprechend der Codierung umgewandelt und als separate Variable abgespeichert.
    "12345" ergibt laut ASCII die Bytes: {49, 50, 51, 52, 53}.
    Also im Arbeitsspeicher werden volgende fünf (plural) Objekte abgelegt:
    (2)

    Quellcode

    1. 00110001
    2. 00110010
    3. 00110011
    4. 00110100
    5. 00110101

    Meine Frage an Dich:
    Ist
    (1)
    das selbe wie
    (2)
    ?

    Wohl nicht.

    Was aber möglich ist:
    Das .Net Framework bietet Funktionen, mit denen Du (2) zu (1) umwandeln kannst.
    Beispiele wären: CInt(), Convert.ToInteger(), Integer.Parse(), Integer.TryParse()

    Wenn Du Option Strict Off hast, dann akzeptiert der Compiler zwar eine Zuweisung eines Strings an einen Integer, erzeugt aber seinerseits geänderten Code: Er fügt eine Konvertierung ein.
    Diese Konvertierung ist allerdings mehr oder weniger einfach dahingerotzt. Denn (2), das war "12345", kann ja in (1), also 12345, umgewandelt werden. Wenn Du aber versuchst "Roulladen" vom Typ String in den Typ Integer umzuwandeln, dann wirst Du scheitern.
    Das macht sich bei der dahingerotzten Konvertierung durch eine InvalidCastException (Ungültige Konvertierung) bemerkbar (Das passiert nebenbei auch bei CInt(), wie es RodFromGermany in seinem Codeschnippsel hat).
    Option Strict On verbietet dieses implizite Konvertieren (so nennt man das). Dadurch wird der Schreiber des Codes dazu gezwungen entweder eine richtige Konvertierung ,z.B. mit Integer.TryParse(), einzubauen, oder eine unsichere, simple Konvertierung, z.B. mit Convert.ToInteger(), einzubauen. Die unsichere Konvertierung könnte man z.B. einsetzen, wenn gesichert ist, dass nur konvertierbare Zeichenfolgen ankommen.

    Wenn man wirklich einen String zu einem Integer konvertieren will, dann verwendet man normalerweise Integer.TryParse().
    Das funktioniert so:

    VB.NET-Quellcode

    1. Dim DeineVariable As Integer
    2. If Integer.TryParse(TextBox1.Text, DeineVariable) Then
    3. 'Die Konvertierung war erfolgreich.
    4. 'Sektflaschen holen und Party machen!
    5. DoSomething(DeineVariable) 'Dann kannst Du die Variable problemlos verwenden.
    6. Else
    7. 'Das, was in der TextBox steht, konnte nicht umgewandelt werden.
    8. 'Und hier sollte dann Fehlerbehandlungscode hin.
    9. End If



    Noch ein kleiner Tipp am Rande:
    Es gibt Controls, die Du Dir aus der ToolBox ziehen kannst, die heißen "NumericUpDown".
    Diese lassen nur Zahlen zu.
    Der Datentyp dieser Zahlen ist Decimal (das ist eine Zahl mit Komma).
    Wenn man im Eigenschaftenfenster des NumericUpDown einstellt, dass keine Kommastellen vorhanden sein sollen, dann lässt sich der Wert problemlos zu Integer konvertieren.
    Darum wäre für das Beispiel mit der Bitmap folgendes besser geeignet:

    VB.NET-Quellcode

    1. Dim Bpm1 As New Bitmap(..., Convert.ToInteger(NumericUpDown_BitmapWidth.Value), Convert.ToInteger(NumericUpDown_BitmapHeight.Value))


    Noch ein Tipp: Benenne die Controls sinnvoll. So kann man im Code besser erkennen, was wofür zuständig ist.



    Edit:
    So. Und um noch was zum Thema zu schreiben:

    Ein einfaches "Da kommt ein Fehler" bringt uns nicht weiter.
    Da Du geschrieben hast, was für ein Fehler kommt, können wir schon mal darauf schließen, dass es sich um Zeile 8 handelt.

    Wenn Dir von VisualStudio ein Fehler angezeigt wird, dann kommt normalerweise so ein Fensterchen mit Tipps drin. Unten sollte irgendwo "Ausnahmedetails anzeigen" stehen. Wenn Du darauf klickst, dann kommt ein weiteres Fenster, in dem Details stehen. Vielleicht kannst Du von dort irgendwelche Informationen herauslesen.
    Möglicherweise solltest Du auch mal nach "Microsoft External Exception (Fehlercode)" googeln.



    Mögliche Ursachen:
    Das Bild ist zu groß
    Die Datei existiert bereits / ist schreibgeschützt
    Der Ordner ist Schreibgeschützt
    Du besitzt nicht die nötigen Rechte um auf den Ordner zuzugreifen
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Niko Ortner“ ()

    danke für die tipps.
    hab ich mal kopiert und in meinen "lern ordner" hinzugefügt ^^

    ich nehme an, ich habe nicht die nötigen rechte den bildschirmhindergrund zu ändern,da das bild aufjeden fall mit der neuen größe erstellt wird.
    ich werde auf jeden fall mal die textboxen mit numericupdown ändern.

    edit://

    VB.NET-Quellcode

    1. Dim breite As Integer = CInt(settings.TextBox1.Text)
    2. Dim höhe As Integer = CInt(settings.TextBox2.Text)

    das gibt doch den inhalt der textboxen als integer an odeR ?
    das gibt doch den inhalt der textboxen als integer an odeR ?

    Ja, das schon.
    Aber wenn Du "Das ist keine Zahl" in die TextBox eingibst, dann kann das nicht in Integer konvertiert werden und die Funktion CInt() wirft eine Exception.
    Und ein Tippfehler kann bei TextBoxen schnell passieren.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils