IconChanger 2.1

Door filenox op woensdag 14 oktober 2009 13:53
Categorie: Software, Views: 2172

Ik heb vandaag een tool met de naam 'IconChanger' gemaakt
die het mogelijk maakt om het icoon van een willekeurige USB-drive makkelijk aan te passen. :)

IconChanger 2.1

ICONCHANGER DOWNLOADEN
(1 .exe van 26kB)


ICONCHANGER 2.1 DOWNLOADEN (1 .exe van 24kB)


En voor de geïnteresseerde, de (nu, oude) broncode: http://pastebin.org/45550
Tips en commentaar zijn zoals altijd welkom :)

Bedankt voor alle commentaar, ik heb nu een nieuwe versie gemaakt waar ik met de volgende commentaar heb rekening gehouden;
-Functie gebruiken
-Het GO-crashprobleem
-OpenFileDialog
-Naamgeving

Hier is een nieuwe downloadlink; klik

Todo:
-Driveinfo gebruiken
-Er voor zorgen dat het icoon-bestand niet 'icoon' moet heten
-Er voor zorgen dat het programma niet moet worden afgesloten als er niets is ingevuld
-Nieuwe commentaar erin verwerken :)

Edit2: Bedankt weer voor alle commentaar, ik heb nu een nieuwe versie gemaakt waar ik met de volgende commentaar heb rekening gehouden;
-Driveinfo gebruiken
-Er voor zorgen dat het icoon-bestand niet 'icoon' moet heten
-Er voor zorgen dat het programma niet moet worden afgesloten als er niets is ingevuld
-Nieuwe commentaar erin verwerken ;)

Dat is allemaal goed gelukt, en hier is de broncode weer:

Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
Imports System.IO
Public Class frmHoofdformulier
    Public bestandsnaam As String
    Public Function bestandmaken()
        Dim doelstick As String = cboDrives.SelectedItem.ToString
        Dim doc As New FileStream(doelstick & "autorun.inf"FileMode.CreateFileAccess.Write)
        Dim inhoud As New StreamWriter(doc)
        inhoud.BaseStream.Seek(0SeekOrigin.End)
        inhoud.WriteLine("[autorun]")
        inhoud.WriteLine("icon=" & bestandsnaam)
        inhoud.Close()
    End Function
    Private Sub frmHoofdformulier_Load(ByVal sender As System.ObjectByVal e As System.EventArgsHandles MyBase.Load
        cboDrives.Items.Clear()
        For Each drv As DriveInfo In DriveInfo.GetDrives()
            If drv.DriveType = DriveType.Removable Then
                cboDrives.Items.Add(drv.Name)
            End If
        Next

    End Sub
    Public Sub btnGo_Click(ByVal sender As System.ObjectByVal e As System.EventArgsHandles btnGo.Click
        'kijken ofdat de combobox is ingevuld
        If cboDrives.SelectedIndex = -1 Then
            MsgBox("Selecteer eerst de USB-drive"MsgBoxStyle.Critical)
            Return
        End If

        'bestand selecteren
        Dim bestand As String
        Dim openDialog As New OpenFileDialog()
        openDialog.Filter = "Iconen (*.ico)|*.ico"
        If openDialog.ShowDialog() = DialogResult.OK Then
            bestand = openDialog.FileName
        Else
            Return
        End If

        'bestandsnaam declareren
        bestandsnaam = openDialog.SafeFileName

        'usbdrive selecteren
        Dim doelstick As String = cboDrives.SelectedItem.ToString

        'Icon controlen + kopiëren
        Dim doelICON As String = (doelstick & bestandsnaam)
        If System.IO.File.Exists(doelICON) = True Then
            System.IO.File.Delete(doelICON)
            System.IO.File.Copy(bestanddoelICON)
        Else : System.IO.File.Copy(bestanddoelICON)
        End If

        'autorun.inf aanmaken
        If System.IO.File.Exists(doelstick & "autorun.inf") = True Then
            System.IO.File.Delete(doelstick & "autorun.inf")
            bestandmaken()
        Else : bestandmaken()
        End If

        'bestanden verbergen
        Dim autorun As IO.FileInfo = My.Computer.FileSystem.GetFileInfo(doelstick & "autorun.inf")
        autorun.Attributes = autorun.Attributes Or IO.FileAttributes.Hidden

        Dim icon As IO.FileInfo = My.Computer.FileSystem.GetFileInfo(doelstick & bestandsnaam)
        icon.Attributes = icon.Attributes Or IO.FileAttributes.Hidden

        MsgBox("Het icoon is succesvol veranderd!"MsgBoxStyle.Information)

    End Sub
    Private Sub Linkfilenox_LinkClicked(ByVal sender As System.ObjectByVal e As System.Windows.Forms.LinkLabelLinkClickedEventArgsHandles LinkLabel1.LinkClicked
        System.Diagnostics.Process.Start("http://filenox.tweakblogs.net")
    End Sub

    Private Sub LinkIconArchive_LinkClicked(ByVal sender As System.ObjectByVal e As System.Windows.Forms.LinkLabelLinkClickedEventArgsHandles LinkLabel2.LinkClicked
        System.Diagnostics.Process.Start("http://www.iconarchive.com/")
    End Sub
End Class


Downloadlink; http://s000.tinyupload.co...e_id=97936709277412897064

Volgende: Tweakers united! 16-01
Volgende: Dé iPhone-killer 20-09

Reacties


Door T.net user Rockster, woensdag 14 oktober 2009 14:08

Goto's worden volgens mij zelden nog gebruikt in 3G talen, en kun je vermijden door je code op te delen in functies (blijft ook overzichtelijker).

http://www.cs.utexas.edu/users/EWD/ewd02xx/EWD215.PDF

Door T.net user filenox, woensdag 14 oktober 2009 14:11

Normaal gebruik ik ook geen GoTo's (dit was de eerste keer trouwens) maar het leek me in dit geval het makkelijkst :)

Door T.net user Boeboe, woensdag 14 oktober 2009 14:16

Normaal gebruik ik ook geen GoTo's (dit was de eerste keer trouwens) maar het leek me in dit geval het makkelijkst
Nooit van functies gehoord dan :?

Door T.net user TeeDee, woensdag 14 oktober 2009 14:17

* TeeDee vraagt zich serieus af waarom je een Goto gebruikt. Zeker als je er nog nooit eerder meegewerkt heb vind ik het een vreemde keuze.

Ook de NLD variabelen vind ik tenenkrommend, maar dat is zoals aangegeven iets persoonlijks.

Door T.net user sanderev66, woensdag 14 oktober 2009 14:17

Dit had wel iets beter gekund :p

1. Je gebruikt een GoTo en een label.. Je weet toch dat die dingen in VB script thuishoren, in VB.Net doen we dat niet meer ;)

2. Als je eerst op Go klikt, crashed het programma.

3. Je kan het beste alleen de removable drives tonen (DriveInfo)

4. Maak het programma zo dat je een .ico bestand kan selecteren (met een OpenFileDialog)

En zo zijn er nog meer dingen ;)

Door T.net user filenox, woensdag 14 oktober 2009 14:17

@ TeeDee, Jawel :)

@sanderev66, bedankt voor je commentaar, daar zal ik vanavond eens naar kijken.
Met OpenFileDialog heb ik al wat zitten proberen maar dat lukte niet helemaal daarom dus deze manier :)

[Reactie gewijzigd op woensdag 14 oktober 2009 14:20]


Door T.net user sanderev66, woensdag 14 oktober 2009 14:23


Visual Basic .NET:
1
2
3
4
5
6
7
8
dim bestand as string
dim openDialog as new OpenFileDialog()
openDialog.Filter = "Iconen (*.ico)|*.ico"
if openDialog.ShowDialog() = DialogResult.OK then
bestand = openDialog.FileName
else
return
end if


Dat moet werken ;)

Door T.net user Lorn, woensdag 14 oktober 2009 14:26

Waarom die je dit soort dingen "If CheckBox1.Checked = True Then'? Het vergelijken met True is compleet overbodig.

Door T.net user sanderev66, woensdag 14 oktober 2009 14:32

Soms is het wel wat leesbaarder ;)

Door T.net user MetalfanBlackness, woensdag 14 oktober 2009 14:37

En ik mag hopen dat de compiler het wel optimaliseert...

Door T.net user neothor, woensdag 14 oktober 2009 14:48

Naamgeving van Forms, Buttons enzo. Form1 en Button1 zijn wel hele goede beschrijvingen ;)

Door T.net user Jogai, woensdag 14 oktober 2009 15:08

Een button met "Klik eerst op mij" kan ook weggeautomatiseerd worden...

Door T.net user dj_vibri, woensdag 14 oktober 2009 15:10

@ sanderev66: 2. Als je eerst op Go klikt, crashed het programma.

vandaar dat er op de eerste button ook duidelijk staat: Klik eerst op mij ... O+

Denk dat het 'tooltje' op zich wel handig zou kunnen zijn maar qua coding kan er nog vééél verbeterd worden :) *no offence, is mijn mening maar*

Door T.net user filenox, woensdag 14 oktober 2009 15:11

Weet ik, maar nu kan het programma vlug vanaf een usb-stick worden gedraaid om bijvoorbeeld de iconen van andere sticks op ook andere computers te wijzigen :)

Bedankt voor de commentaar trouwens, er wordt - straks- aan gewerkt ;)

[Reactie gewijzigd op woensdag 14 oktober 2009 15:11]


Door T.net user Rhapsody, woensdag 14 oktober 2009 15:54

Ik denk dat je vanuit VB6 komt, of niet?

Door T.net user filenox, woensdag 14 oktober 2009 16:15

Nieuwe versie staat online :)
Laat de commentaar maar weer komen ;)

Door T.net user Phyxion, woensdag 14 oktober 2009 16:37

Verschrikkelijke 'taal' VB, kan me niet voorstellen dat iemand daar nog in wil werken en vooral kan werken.

Door T.net user sanderev66, woensdag 14 oktober 2009 16:57

Wat is er mis met VB? Ik vind het vaak een stuk leesbaarder dan C-achtigen. (Echter ben ik wel overgestapt op C#)

Ik heb nog wel 2 opmerkingen, je moet niet de filename property van de OpenFileDialog aanpassen. ;)

En:

Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)
        MyBase.OnLoad(e)

        LoadDrives()
    End Sub

    Private Sub LoadDrives()

        cboDrives.Items.Clear()
        For Each drv As DriveInfo In DriveInfo.GetDrives()
            If drv.DriveType = DriveType.Removable Then
                cboDrives.Items.Add(drv.Name)
            End If
        Next
        cboDrives.SelectedIndex = 0

    End Sub

Zo krijg je de stationletters van USB drives in je combobox ;) Ook is het verstandig om van de combobox de DropDownStyle op DropDownList te zetten ;) Je kan LoadDrives ook vanaf een nieuwe knop aanroepen om zo de lijst te refreshen.

[Reactie gewijzigd op woensdag 14 oktober 2009 16:58]


Door T.net user sanderev66, woensdag 14 oktober 2009 17:21

Kan mn post niet editen..

Visual Basic .NET:
1
2
3
4
5
6
'kijken ofdat de combobox is ingevuld 
        If cboDrives.SelectedIndex < "0" Then 
            MsgBox("Selecteer eerst de USB-drive"
            Me.Close() 
        Else 
        End If


Dit kan je het beste veranderen in:

code:
1
2
3
4
5
'kijken ofdat de combobox is ingevuld 
        If cboDrives.SelectedIndex < 0 Then 
            MessageBox.Show("Selecteer eerst de USB-drive", "Fout") 
            Return
        End If


Werkt wat beter ;)

Door T.net user filenox, woensdag 14 oktober 2009 17:25

Vreemd dat je je reactie niet kan bewerken, bij de instellingen staat alles nog goed :?
Maar euu bedankt voor je code, het combobox-gedoe is ook al opgelost, maar op een andere manier, de code en een nieuwe exe zal ik later uploaden :)

Door T.net user sanderev66, woensdag 14 oktober 2009 17:30

Oké ik wacht wel af :)

Door T.net user JokerLash, woensdag 14 oktober 2009 19:49

Je kan bijvoorbeeld dit:

Visual Basic .NET:
1
2
3
4
5
6
'bestanden verbergen 
        Dim autorun As IO.FileInfo = My.Computer.FileSystem.GetFileInfo(doelstick & ":\autorun.inf"
        autorun.Attributes = autorun.Attributes Or IO.FileAttributes.Hidden 

        Dim icon As IO.FileInfo = My.Computer.FileSystem.GetFileInfo(doelstick & ":\icoon.ico"
        icon.Attributes = icon.Attributes Or IO.FileAttributes.Hidden


Vervangen door:

Visual Basic .NET:
1
2
3
4
5
6
7
8
9
HideFile(doelstick & ":\autorun.inf")
HideFile(doelstick & ":\icoon.ico")

Private Sub HideFile(ByVal file As String)
    If System.IO.File.Exists(fileThen
        Dim f As IO.FileInfo = My.Computer.FileSystem.GetFileInfo(file
        f.Attributes = f.Attributes Or IO.FileAttributes.Hidden
    End If
End Sub


Code wordt wel langer maar wel bruikbaarder en leesbaarder.

Als je bijvoorbeeld de bestandsnaam van het icon wil aanhouden dat geopend wordt moet je een kijken naar de File class, hiervan kan je ook heel eenvoudig alleen de bestandsnaam opvragen in plaats van het gehele pad.

[Reactie gewijzigd op woensdag 14 oktober 2009 19:49]


Door T.net user JokerLash, woensdag 14 oktober 2009 20:39

Rewrite ;)


Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
Imports System.IO 
Public Class frmHoofdformulier 

    Private Sub btnGo_Click(ByVal sender As System.ObjectByVal e As System.EventArgsHandles btnGo.Click 

        'kijken ofdat de combobox is ingevuld 
        If cboDrives.SelectedIndex < "0" Then 
            MsgBox("Selecteer eerst de USB-drive""Fout"
            Return    
        End If 

        ' Variabelen definitie
        Dim srcIcon As String 
        Dim destDrive As String = cboDrives.SelectedItem.ToString 
        Dim destIcon As String = (destDrive & ":\icoon.ico")
        Dim destAutorun As String = (destDrive & ":\autorun.inf")

        'bestand selecteren 
        Dim openDialog As New OpenFileDialog() 
        openDialog.Filter = "Iconen (*.ico)|*.ico" 
        openDialog.FileName = "icoon" 
        If openDialog.ShowDialog() = DialogResult.OK Then 
            srcIcon = openDialog.FileName 
        Else 
            Return 
        End If 
          
        'Icon controleren + kopiëren         
        ' zie http://msdn.microsoft.com/en-us/library/system.io.file.copy.aspx
        ' 3e parameter zorgt ervoor dat je mag overschrijven
        System.IO.File.Copy(srcIcondestIconTrue)         

        'autorun.inf aanmaken 
        If System.IO.File.Exists(destAutorunThen 
            System.IO.File.Delete(destAutorun
        End If
        CreateAutorun(destAutorun

        'bestanden verbergen 
        HideFile(destAutorun)
        HideFile(destIcon)

        MsgBox("Het icoon is succesvol veranderd!"MsgBoxStyle.Information

    End Sub 
    
    Private Sub Linkfilenox_LinkClicked(ByVal sender As System.ObjectByVal e As System.Windows.Forms.LinkLabelLinkClickedEventArgsHandles LinkLabel1.LinkClicked 
        System.Diagnostics.Process.Start("http://filenox.tweakblogs.net"
    End Sub 

    Private Sub LinkIconArchive_LinkClicked(ByVal sender As System.ObjectByVal e As System.Windows.Forms.LinkLabelLinkClickedEventArgsHandles LinkLabel2.LinkClicked 
        System.Diagnostics.Process.Start("http://www.iconarchive.com/"
    End Sub 

    Public Function CreateAutorun(ByVal file As String)         
        Dim doc As New FileStream(fileFileMode.CreateFileAccess.Write
        Dim sw As New StreamWriter(doc
        sw.BaseStream.Seek(0SeekOrigin.End
        sw.WriteLine("[autorun]"
        sw.WriteLine("icon=icoon.ico"
        sw.Close() 
    End Function 
    
    Private Sub HideFile(ByVal file As String)
        If System.IO.File.Exists(fileThen
            Dim f As IO.FileInfo = My.Computer.FileSystem.GetFileInfo(file
            f.Attributes = f.Attributes Or IO.FileAttributes.Hidden
        End If
    End Sub
    
End Class

[Reactie gewijzigd op woensdag 14 oktober 2009 20:40]


Door T.net user himlims_, woensdag 14 oktober 2009 23:53


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
See the end of this message for details on invoking 
just-in-time (JIT) debugging instead of this dialog box.

************** Exception Text **************
System.IO.FileNotFoundException: Could not find file 'C:\Icon\icoon.ico'.
File name: 'C:\Icon\icoon.ico'
   at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
   at System.IO.File.InternalCopy(String sourceFileName, String destFileName, Boolean overwrite)
   at System.IO.File.Copy(String sourceFileName, String destFileName)
   at IconChanger.Form1.Button1_Click(Object sender, EventArgs e)
   at System.Windows.Forms.Control.OnClick(EventArgs e)
   at System.Windows.Forms.Button.OnClick(EventArgs e)
   at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
   at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.ButtonBase.WndProc(Message& m)
   at System.Windows.Forms.Button.WndProc(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)


************** Loaded Assemblies **************
mscorlib
    Assembly Version: 2.0.0.0
    Win32 Version: 2.0.50727.3053 (netfxsp.050727-3000)
    CodeBase: file:///C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/mscorlib.dll
----------------------------------------
IconChanger
    Assembly Version: 1.0.0.0
    Win32 Version: 1.0.0.0
    CodeBase: file:/IconChanger.exe
----------------------------------------
Microsoft.VisualBasic
    Assembly Version: 8.0.0.0
    Win32 Version: 8.0.50727.3053 (netfxsp.050727-3000)
    CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/Microsoft.VisualBasic/8.0.0.0__b03f5f7f11d50a3a/Microsoft.VisualBasic.dll
----------------------------------------
System
    Assembly Version: 2.0.0.0
    Win32 Version: 2.0.50727.3053 (netfxsp.050727-3000)
    CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System/2.0.0.0__b77a5c561934e089/System.dll
----------------------------------------
System.Windows.Forms
    Assembly Version: 2.0.0.0
    Win32 Version: 2.0.50727.3053 (netfxsp.050727-3000)
    CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Windows.Forms/2.0.0.0__b77a5c561934e089/System.Windows.Forms.dll
----------------------------------------
System.Drawing
    Assembly Version: 2.0.0.0
    Win32 Version: 2.0.50727.3053 (netfxsp.050727-3000)
    CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Drawing/2.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll
----------------------------------------
System.Runtime.Remoting
    Assembly Version: 2.0.0.0
    Win32 Version: 2.0.50727.3053 (netfxsp.050727-3000)
    CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Runtime.Remoting/2.0.0.0__b77a5c561934e089/System.Runtime.Remoting.dll
----------------------------------------

************** JIT Debugging **************
To enable just-in-time (JIT) debugging, the .config file for this
application or computer (machine.config) must have the
jitDebugging value set in the system.windows.forms section.
The application must also be compiled with debugging
enabled.

For example:

<configuration>
    <system.windows.forms jitDebugging="true" />
</configuration>

When JIT debugging is enabled, any unhandled exception
will be sent to the JIT debugger registered on the computer
rather than be handled by this dialog box.


doe eerst nog een check of er een ico is; zo niet geef dan nette melding

[Reactie gewijzigd op woensdag 14 oktober 2009 23:53]



Door T.net user filenox, vrijdag 16 oktober 2009 18:51

de nieuwste versie, IconChanger 2.1 staat online :)


Door T.net user sanderev66, zaterdag 17 oktober 2009 22:38

Knap werk! Hij is nu bijna perfect, je moet alleen nog een knopje toevoegen waarmee we de combobox opnieuw kunnen inlezen (Reload.. ofzo) zodat we het programma niet hoeven te herstarten als je een USB stick later aansluit ;)

Reactie formulier
(verplicht)
(verplicht, maar wordt niet getoond)
(optioneel)

Voer de code van onderstaand anti-spam plaatje in: