Die Community zu .NET und Classic VB.
Menü

VB 5/6-Tipp 0401: Windows-Startbutton nach Belieben manipulieren

 von 

Beschreibung 

Mit dem Startbutton läßt sich, wie hier gezeigt, so einiges anstellen. Er läßt sich verstecken, mit einer anderen Grafik belegen und sogar frei über die Taskleiste bewegen.

Schwierigkeitsgrad:

Schwierigkeitsgrad 2

Verwendete API-Aufrufe:

FindWindowExA (FindWindowEx), LoadImageA (LoadImage), SendMessageA (SendMessage), SetWindowPos, ShowWindow

Download:

Download des Beispielprojektes [3,65 KB]

'Dieser Quellcode stammt von http://www.activevb.de
'und kann frei verwendet werden. Für eventuelle Schäden
'wird nicht gehaftet.

'Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
'Ansonsten viel Spaß und Erfolg mit diesem Source!

'------------- Anfang Projektdatei Project1.vbp -------------
'--------- Anfang Formular "Form1" alias Form1.frm  ---------
' Steuerelement: Timersteuerelement "Timer1"
' Steuerelement: Kontrollkästchen-Steuerelement "Check3"
' Steuerelement: Kontrollkästchen-Steuerelement "Check2"
' Steuerelement: Kontrollkästchen-Steuerelement "Check1"

Option Explicit

Private Declare Function FindWindowEx Lib "user32" Alias _
        "FindWindowExA" (ByVal hwnd As Long, ByVal hWndChild _
        As Long, ByVal lpszClassName As Any, ByVal lpszWindow _
        As Any) As Long

Private Declare Function SetWindowPos Lib "user32" (ByVal _
        hwnd As Long, ByVal hWndInsertAfter As Long, ByVal _
        X As Long, ByVal Y As Long, ByVal cx As Long, ByVal _
        cy As Long, ByVal wFlags As Long) As Long
        
Private Declare Function SendMessage Lib "user32" Alias _
        "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As _
        Long, ByVal wParam As Long, ByVal lParam As Long) _
        As Long
        
Private Declare Function ShowWindow Lib "user32" (ByVal hwnd _
        As Long, ByVal nCmdShow As Long) As Long
       
Private Declare Function LoadImage Lib "user32" Alias _
        "LoadImageA" (ByVal hInst As Long, ByVal lpsz As String, _
        ByVal iImageType As Long, ByVal cx As Long, ByVal cy As _
        Long, ByVal fFlags As Long) As Long
        
Const SW_HIDE As Long = 0&
Const SW_RESTORE As Long = 9&
Const GW_CHILD As Long = 5&
Const SWP_NOSIZE As Long = &H1&
Const WM_CLOSE As Long = &H10&

Const BM_GETIMAGE As Long = &HF6&
Const BM_SETIMAGE As Long = &HF7&
Const IMAGE_BITMAP As Long = &H0&
Const LR_LOADFROMFILE As Long = &H10&

Dim hStart As Long
Dim Flag As Boolean
Dim hOldPic As Long, hNewPic As Long

Private Sub Form_Load()
    Dim Result As Long
    
    Result = FindWindowEx(0&, 0&, "Shell_TrayWnd", 0&)
    hStart = FindWindowEx(Result, 0&, "BUTTON", 0&)
    
    hOldPic = SendMessage(hStart, BM_GETIMAGE, IMAGE_BITMAP, ByVal 0&)
                     
    Timer1.Interval = 50
    Timer1.Enabled = False
End Sub

Private Sub Form_Unload(Cancel As Integer)
    Call ResetBtnStart
End Sub

Private Sub Check1_Click()
    If Check1.Value = vbChecked Then
        Call ShowWindow(hStart, SW_HIDE)
    Else
        Call ShowWindow(hStart, SW_RESTORE)
        Call SetWindowPos(hStart, 0&, 0&, 0&, 0&, 0&, SWP_NOSIZE)
    End If
End Sub

Private Sub Check2_Click()
    If Check2.Value = vbChecked Then
        hNewPic = LoadImage(0&, App.Path & IIf(Right(App.Path, 1) = "\", "", "\") & "Pic.bmp", _
                  IMAGE_BITMAP, 0&, 0&, LR_LOADFROMFILE)
        
        Call SendMessage(hStart, BM_SETIMAGE, IMAGE_BITMAP, ByVal hNewPic)
    Else
        Call SendMessage(hStart, BM_SETIMAGE, IMAGE_BITMAP, ByVal hOldPic)
    End If
End Sub

Private Sub Check3_Click()
    Timer1.Enabled = IIf(Check3.Value, vbChecked, vbUnchecked)
End Sub

Private Sub Timer1_Timer()
    Static X As Long, Y As Long, f As Long
    
    If Not Flag Then
        f = 2
        X = 0
        Flag = True
    End If
  
    Y = Sin(X / 10) * 10
    SetWindowPos hStart, 0&, X, Y, 0&, 0&, SWP_NOSIZE
    X = X + f
    
    If X > 200 Then f = -2
    If X < 0 Then f = 2
End Sub

Private Sub ResetBtnStart()
    Timer1.Enabled = False
    Call ShowWindow(hStart, SW_RESTORE)
    Call SetWindowPos(hStart, 0&, 0&, 0&, 0&, 0&, SWP_NOSIZE)
    
    Call SendMessage(hStart, BM_SETIMAGE, IMAGE_BITMAP, _
         ByVal hOldPic)
    
End Sub
'---------- Ende Formular "Form1" alias Form1.frm  ----------
'-------------- Ende Projektdatei Project1.vbp --------------

Tipp-Kompatibilität:

Windows/VB-VersionWin32sWin95Win98WinMEWinNT4Win2000WinXP
VB4
VB5
VB6

Hat dieser Tipp auf Ihrem Betriebsystem und mit Ihrer VB-Version funktioniert?

Ja, funktioniert!

Nein, funktioniert nicht bei mir!

VB-Version:

Windows-Version:

Ihre Meinung  

Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.

Archivierte Nutzerkommentare 

Klicken Sie diesen Text an, wenn Sie die 20 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.

Kommentar von Greeny am 19.05.2010 um 22:36

Das liegt an Windows XP selbst,
wenn man seine Startleiste im Design-Modus anzeigen lässt geht's nicht.
Mit XP im Klasischen modus: kein Problem

Gruß Greeny

Kommentar von Stefan Lehmann am 07.02.2006 um 16:45

Also funktioniert schon ganz gut. Aber ich habe genau das gleiche Problem mit dem Bild bei VB6.0. Habe nur WINXP Home, also muss es an der VB- Version liegen. Wenn jemd. eine Lösung hat, wäre ich ganz dankbar.
Guter Tipp
Grüße

Kommentar von s_qw23 am 22.08.2005 um 16:21

Wenn ich den genau gleichen Code kopiere und in ein anderes Projekt kopiere funtzt er nicht mehr. Es gibt keine Fehler alle API Funktionen sind deklariert aber wenn ich dann auf den button drücke funtz es nicht mehr. Es passiert einfach nichts!!! An was liegt dass denn so etwas is mir noch nie passiert!!!

Kommentar von Michael Wolf am 09.07.2005 um 11:17

Hat denn einer schon ne Lösung für VB6/WinXP.Pro fürs Bild gefunden?
Danke! ^^

Kommentar von elexis am 06.04.2005 um 21:27

Wenn Fun-Viren wichtig sind, dann ja ;)

Kommentar von @on am 06.04.2005 um 16:51

lustiger eintrag aber irgendwie alles nur spielerei oder gibst da ne wichtige anwendung?

Kommentar von elexis am 02.04.2005 um 20:31

Den StartButton kann man ganz einfach "resetten" indem man den Explorer neustartet!
{Taskmanager -> Explorer.exe beenden -> Neuen Prozess starten: explorer.exe}

Kommentar von Martin am 06.10.2004 um 05:07

Unter WinXp.Prof mit VB6 Enter. kann man die Grafik nicht ändern.

Kommentar von Hugo Dumpfbecker am 05.08.2003 um 14:13

bay mir ist der Rechner gans abgestürtzt wo ich den Kot reingetan habe.

Kommentar von Jochen Wierum am 08.03.2003 um 17:03

Hallo Beginner,

Du hast 2 Möglichkeiten.
Entweder, du klickst oben auf die Diskette, lädst den Code herunter, entpackst die zip-Datei und startest die VBP-Datei - oder - du startest VB, wählst "Standart - Exe", gehst in den Code von Form1, markierst alles und überschreibst dies mit dem Code, der oben abgedruckt ist!

Kommentar von Beginner am 08.03.2003 um 15:09

nein, aber was muss ich bei VB6.0 aufmachen und dann diesen code reinfügen damit er funtz?

Kommentar von Steffen Eckardt am 04.03.2003 um 14:17

Unter WinNT4 funktioniert das Verschieben und Verstecken des Buttons, aber anscheinend scheitert der LoadImage-Aufruf von 'pic.bmp', der Button wird einfach nur grau. Das Zurücksetzen auf das alte Bild funktioniert. Es kann also nur am LoadImage liegen.

Kommentar von wuk am 11.05.2002 um 17:00

Unter WIN95 mit VB6 läßt sich zwar die Grafik ändern, aber nur solang die Entwicklungsumgebung geöffnet ist. Beendet man das Projekt, ist überhaupt keine Grafik mehr zu sehen. Die Starttsate ist nur noch grau, funktioniert aber.
Zum Glück ist nach dem Neustart des Rechners wieder alles beim alten.

Kommentar von Sven Uhlig am 18.11.2001 um 15:06

Unter WinXp.Prof mit VB6 Prof. kann man die Grafik nicht ändern.

Kommentar von Olli Andres am 23.08.2001 um 11:51

Bei mir funktioniert alles einwandfrei unter NT 4.0 SP 5 ...
Vielleicht muss man lokaler Admin sein...
Eine Frage noch..
Wie kann ich denn einfach den Text abändern ?

Kommentar von Flo am 16.08.2001 um 18:01

Ich kann doch damit auch Bilder von anderen Fenstern und Buttons hohlen, oder? z.b: Im Arbeitsplatzfenster den Schließen (X) Button. Wie muss ich das dann machen? Was muss ich statt "Tray_ShellWindow"und "BUTTON" angeben?

Kommentar von Florian am 10.08.2001 um 14:49

Unter NT 4.0 läuft die "Move it"-Option nicht, da Windows den Button anscheind immer wieder refresht!

Kommentar von Florian am 10.08.2001 um 10:56

Die Option "Anderes Bild für Startbutton" läuft unter Win 2k Prof. nicht einwandfrei! Das WinLogo und die Schrift verschwindet zwar vom Button (und man kann ihn auch noch betätigen), allerdings funktioniert die "Load Image"-Function nicht!

Kommentar von müller marco am 07.08.2001 um 15:21

Ich habe eine Frage, ich habe win2000 und der Start button funktioniert nicht mehr, das heisst wenn ich ihn betätige friert er einfach ein. können sie mir helfen?

Kommentar von Silver Blue am 01.08.2001 um 17:47

Ich krieg das bild nicht mehr weg , das auf meinem StartButton is! Wer kann helfen? *RegEditstart*