FlashWindow

  • VB.NET

Es gibt 19 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    In einer Form (Form1) habe ich einen Button mit dem ich das Blinken der Form im Taskbar an- und ausschalten kann.
    Das funktioniert auch.

    Jetzt möchte ich aber aus einer zweiten Form (Form2) heraus mittels Button auch das Blinken an-und abstellen können.
    Dies funktioniert auch, doch bleibt die Farbe im Taskbar auf dunkelblau stehen und nicht auf grau, das nervt. Hier der Code:
    Ich hoffe, dass mir jemand helfen kann. Grüße

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Declare Function FlashWindow Lib "user32" (ByVal a As Integer, ByVal b As Integer) As Integer
    3. Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    4. Form2.Show()
    5. End Sub
    6. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    7. If Me.Button1.BackColor = Color.LightGray Then
    8. Me.Button1.BackColor = Color.LightSalmon
    9. Form2.Button1.BackColor = Color.LightSalmon
    10. Me.Button1.Text = "On"
    11. Form2.Button1.Text = "On"
    12. Timer1.Start()
    13. Else
    14. Me.Button1.BackColor = Color.LightGray
    15. Form2.Button1.BackColor = Color.LightGray
    16. Me.Button1.Text = "Off"
    17. Form2.Button1.Text = "Off"
    18. Timer1.Stop()
    19. End If
    20. End Sub
    21. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    22. Call FlashWindow(Me.Handle, True)
    23. End Sub
    24. End Class
    25. Public Class Form2
    26. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    27. Form1.Button1.PerformClick()
    28. End Sub
    29. End Class

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Michael0011“ ()

    Hab mal einen Test gemacht mit einem zweiten Timer in Form1.
    Der Timer muß auf mindestens 1 Sekunde stehen (also 1000 ms) und standardmäßig disabled.
    Ist der Intervall kürzer, dann klappt es nicht.

    Im Prinzip wird durch den Knopfdruck der Button1 von Form1 gedrückt.
    Dann wird Form1 in den Vordergrund gebracht.
    Dann der Timer2 aktiviert.

    Nach der in Timer2 eingestellten Zeit wird dann die Form1 refresht und die Form2 wieder aktiviert.



    VB.NET-Quellcode

    1. '--- Timer2 von Form1
    2. Private Sub Timer2_Tick(sender As System.Object, e As System.EventArgs) Handles Timer2.Tick
    3. Timer2.Enabled = False
    4. Me.Refresh()
    5. Form2.BringToFront()
    6. End Sub

    VB.NET-Quellcode

    1. Public Class Form2
    2. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    3. If ( Form1.Timer1.Enabled ) then
    4. Form1.Button1.PerformClick()
    5. Form1.BringToFront()
    6. Form1.Timer2.Enabled = True
    7. End Sub
    8. End Sub
    9. End Class


    gmu

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „gmu“ ()

    Setz einen Haltepunkt rein und verfolge, was da passiert.
    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!
    Den Code habe ich doch eingangs mitgeliefert: Form1 mit einem Button und einem Timer. (Timer auf Interval 500 z. B.) Form2 mit einem Button. Den Code kannst du aus meinem ersten Post kopieren. Will man jetzt das FlashWindow der Form1 über den Button der Form2 stoppen, so bleibt es in der Regel auf dunkelblau stehen. Das ist das Problem. Die Lösung, die ich suche wäre folgende:

    Wie kann ich das FlashWindow mittels Click auf den Button in der Form2 beenden, ohne dass die Form1 in der Taskbar auf dunkelblau stehen bleibt und OHNE die Form1 in den Vodergrund bringen zu müssen. Das wäre nämlich relativ einfach (Form1.focus()). Vielen Dank noch mal ...

    Grüße
    @Michael0011: Gib Deinem Projekt bitte mal Option Strich On.

    VB.NET-Quellcode

    1. Private Declare Function FlashWindow Lib "user32" (ByVal a As IntPtr, ByVal b As Boolean) As Boolean
    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!
    Es verhindert, dass Du Äpfel mit Glühbirnen vermengst.
    Auch wenn Du erst 5 Beiträge hast, sind wir hier im Hauptforum.
    Gib bitte Option Strict On (Tschuldigung, bei mir verschrieben) oben rechts im Suchfenster ein.
    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!
    Ok, fertig beide Formen laufen jetzt mit Option Strict On und mit
    Private Declare Function FlashWindow Lib "user32" (ByVal a As IntPtr, ByVal b As Boolean) As Boolean
    .... joé ... funktioniert aber immer noch nicht. I'm sorry.

    Grüße

    Michael0011 schrieb:

    funktioniert aber immer noch nicht.
    Das war mir klar. :D
    Füge mal dies nach Timer1.Stop() ein und lies mal die Hilfe (MSDN):

    VB.NET-Quellcode

    1. FlashWindow(Me.Handle, False)
    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!
    Ok, Call FlashWindow(Me.Handle, False) hatte ich schon nach Timer1.stop eingefügt, das hatte ich auch schon probiert bevor ich hier gepostet habe, funktioniert aber auch nicht bei mir.

    Auf jeden Fall schönen Dank für die Hilfe, und sollte ich hier aus versehen im falschen Forum gelandet sein, dann bitte ich vielmals um Entschuldigung.

    Michael

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Michael0011“ ()

    Das mit False hat bei mir auch nicht geklappt.
    Das geflashte Fenster muss scheinbar eine Zeit aktiv sein, bis sich das Flashen auf der Taskbar deaktiviert.

    Probier mal mein Testprojekt aus.

    Dort klickst du in Form1 auf den Button "Fenster 2".

    Dann öffnet sich Form2. Das hat den Button "Button1". Damit kannst Du das flashen ein/ausschalten.

    Achte darauf, dass der Form1.Timer2 auf mindestens 1000 ms steht.

    gmu
    Dateien
    • Menütest.zip

      (81,51 kB, 97 mal heruntergeladen, zuletzt: )
    Ok, gmu, schönen Dank, funktioniert aber nur manchmal auf meinem System, d.h. manchmal bleibt Form1 auf grau und manchmal auf dunkelblau stehen und dann kommt der Retard-Effekt optisch auch nicht besonders cool rüber ;). Aber recht schönen Dank für deine Mühe, ich werde die Option bei meinem Programm anderweitig lösen.

    Ciao
    Hallo nochmals, die Lösung ist:

    Zwei Formen (Form1, Form2) mit je einem Button (Form1.Button1, Form2.Button1) und dann:
    Code der ersten Form:

    VB.NET-Quellcode

    1. Imports System.Runtime.InteropServices
    2. Public Class Form1
    3. <DllImport("user32.dll")> _
    4. Public Shared Function FlashWindowEx(ByRef Trala As FLASHWINFO) As Integer
    5. End Function
    6. <StructLayout(LayoutKind.Sequential)> _
    7. Structure FLASHWINFO
    8. Dim cbSize As Integer
    9. Dim hwnd As System.IntPtr
    10. Dim dwFlags As Integer
    11. Dim uCount As Integer
    12. Dim dwTimeout As Integer
    13. End Structure
    14. Private Const FLASHW_STOP As Integer = &H0
    15. Private Const FLASHW_CAPTION As Integer = &H1
    16. Private Const FLASHW_TRAY As Integer = &H2
    17. Private Const FLASHW_ALL As Integer = (FLASHW_CAPTION Or FLASHW_TRAY)
    18. Private Const FLASHW_TIMER As Integer = &H4
    19. Private Const FLASHW_TIMERNOFG As Integer = &HC
    20. Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    21. Form2.Show()
    22. End Sub
    23. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    24. Dim FlashInfo As FLASHWINFO
    25. If Me.Button1.BackColor = Color.LightGray Then
    26. Me.Button1.BackColor = Color.LightSalmon
    27. Form2.Button1.BackColor = Color.LightSalmon
    28. With FlashInfo
    29. .cbSize = CInt(Convert.ToUInt32(Marshal.SizeOf(GetType(FLASHWINFO))))
    30. .dwFlags = CType(FLASHW_TRAY Or FLASHW_TIMER, Int32)
    31. .hwnd = Me.Handle
    32. .dwTimeout = 0
    33. .uCount = 0
    34. End With
    35. Else
    36. Me.Button1.BackColor = Color.LightGray
    37. Form2.Button1.BackColor = Color.LightGray
    38. With FlashInfo
    39. .cbSize = CInt(Convert.ToUInt32(Marshal.SizeOf(GetType(FLASHWINFO))))
    40. .dwFlags = CType(FLASHW_STOP, Int32)
    41. .hwnd = Me.Handle
    42. .dwTimeout = 0
    43. .uCount = 0
    44. End With
    45. End If
    46. FlashWindowEx(FlashInfo)
    47. End Sub
    48. End Class


    Code der zweiten Form:

    VB.NET-Quellcode

    1. Public Class Form2
    2. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    3. Form1.Button1.PerformClick()
    4. End Sub
    5. End Class


    Grüße Michael

    Michael0011 schrieb:

    VB.NET-Quellcode

    1. Form1.Button1.PerformClick()
    Gugst Du hier.
    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!

    Michael0011 schrieb:

    VB.NET-Quellcode

    1. Form1
    ist ja wohl der Name der Klasse, nicht aber eine Variable, die eine mit New erzeugte Instanz derselben hält.
    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!