Form im Vordergrund aber hinter Taskleiste

  • VB.NET

Es gibt 19 Antworten in diesem Thema. Der letzte Beitrag () ist von Gelöschter Benutzer.

    Form im Vordergrund aber hinter Taskleiste

    Hallo zusammen,

    ich möchte ein Informationsfenster anzeigen lassen, nachdem ich das mit der Sprechblase jetzt verworfen habe, indem Hinweise angezeigt werden. Der Code usw. sind fertig, jetzt habe ich aber das Problem, dass ich das Fenster zwar im Vordergrund, aber hinter der Taskleiste haben möchte. Wenn TopMost = true dann schiebt sich das Fenster zwar vor alles andere, aber auch vor die Taskleiste, aber wenn TopMost = false, dann verschwindet das Fenster hinter allen anderen Fenstern.

    Mein Code:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Information
    2. Public ticks As Integer = 0
    3. Public state As Integer = 0
    4. Private Sub Information_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    5. Me.Location = New Point(System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width - Me.Width, System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height)
    6. End Sub
    7. Private Sub tmr_Timer_Tick(sender As Object, e As EventArgs) Handles tmr_Timer.Tick
    8. Select Case state
    9. Case 0
    10. If Me.Location.Y = System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Height - Me.Height Then
    11. state = 1
    12. Else
    13. Me.Location = New Point(Me.Location.X, Me.Location.Y - 1)
    14. End If
    15. Case 1
    16. ticks = ticks + 1
    17. If ticks > 200 Then
    18. state = 2
    19. End If
    20. Case 2
    21. If Me.Location.Y = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height Then
    22. tmr_Timer.Enabled = False
    23. Me.Close()
    24. Else
    25. Me.Location = New Point(Me.Location.X, Me.Location.Y + 1)
    26. End If
    27. End Select
    28. End Sub
    29. End Class


    Hat jemand eine Idee wie ich das Problem beheben kann?

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

    Hey,

    so etwas ähnliches werde ich auch noch machen :)
    Bin momentan dran.

    Du bräuchtest die SetWindowPos Funktion von Windows.

    VB.NET-Quellcode

    1. Declare Function SetWindowPos Lib "user32.dll" (ByVal hwnd As IntPtr, ByVal hWndInsertAfter As Int32, _
    2. ByVal x As Int32, ByVal y As Int32, ByVal cx As Int32, _
    3. ByVal cy As Int32, ByVal wFlags As Int32) As Int32


    Werde heute Abend erst wieder dran können, deswegen hau ich dir das mal um die Ohren.
    Sollte dich aber weiterbringen!

    Grüße,
    Drahuverar
    Option Strict On!
    Also bevor wir aneinander vorbeiquatschen.
    Im Grunde möchtest du doch deine Form (Ich gehe von einer Form aus) immer auf dem Desktop haben?
    Sprich Vor dem Desktop aber unter der Task-leiste?
    Ist das mit der Task-leiste wichtig, oder würde es genügen wenn die Form fest auf dem Desktop ist?

    Momentan tüftel ich an folgendem;
    Eine kleine Anwendung die immer aktiv ist und auf dem Desktop. Eben um eine Auflistung von gewissen Sachen anzuzeigen.
    So etwas ähnliches brauchst du auch?

    Grüße,
    Drahuverar
    Option Strict On!
    Nicht so ganz,

    ich möchte ein kleines Fenster haben, das über eine andere Form geöffnet wird,
    von unten dann hochscrollt, und nach einer weile wieder wegscrollt.
    Die Form soll nur kurz Text anzeigen um den Nutzer auf etwas hinzuweisen.
    Ähnlich wie eine Benachrichtigung!

    Hoffe ich habe mich verständlich ausgedrückt sodass alle verstehen was ich mir vorstelle...
    Hey!
    Hab mal eben fix ein kleines Beispiel gemacht, so würde ich es tun.
    Ich hab alles mal kommentiert, du kannst das natürlich noch nach deinen Bedürfnissen anpassen. Aber so sollte es gehen :)

    Ich habe es mit Opacity gemacht. Das blinkt dann noch etwas~
    So kannst du dir sicher sein, dass der User es durch schließen bestätigt hat. (Somit wurde es gesehen)

    Edit:
    Von unten nach oben sollte kein Problem sein, einfach mit Height spielen.

    Hoffe das hilft dir weiter. :)

    Grüße,
    Drahuverar
    Dateien
    Option Strict On!

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

    Wieso hast du denn die Ballonsache verworfen?
    Wenn ich mich recht erinner dürfte da nur bei dir am PC was im argen sein. Hast es mal an einem anderen PC probiert?
    Das ist meine Signatur und sie wird wunderbar sein!
    @Drahuverar und alle anderen die nicht so ganz wissen was ich mir vorstelle:

    Dein Projekt ist nicht so wirklich das was ich mir wünsche!
    Ich habe mal den Code rausgenommen und ein kleines Projekt gemacht indem du siehst wie ich mir das vorstelle!

    Hoffe das hilft dir (und den anderen) zu verstehen was ich möchte!

    @Mono: Habe erfahren das alle PCs in der Firma dieses "Problem" haben. Da dieses Projekt für einige Mitazubis ist musste ich mir da etwas anderes ausdenken!
    Dateien
    • Nachricht.zip

      (89,34 kB, 131 mal heruntergeladen, zuletzt: )
    @Serpifeu7
    Uff.. das ist echt mies. Da wir TopMost nutzen, ist es halt TopMost. Anders geht die Nachricht aber unter, sobald man etwas anderes fokussiert..

    Mal 'ne andere Idee:
    Wie wäre es, die Nachricht wachsen zu lassen?
    Sprich durch die .Size Eigenschaft die Form 'aufwachsen' zu lassen?

    Mit Screen.PrimaryScreen.Workingarea.Height - taskbar (kA ob die Taskbar irgendwie abgegriffen werden kann, zur Not Bounds.Height - WorkingArea.Height ;) ) könntest du die Position der Form angeben und dann über
    Me.Size = New Size (Me.Width, i) die Form beim ticken wachsen lassen.
    Würde sicher auch cool aussehen! :)

    Wie gesagt, ich schaue mal genauer nach, sobald ich kann.

    Grüße
    Option Strict On!

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

    Geht einfacher! Ersetze Bounds durch WorkingArea dann hast du den Bereich ohne Taskleiste!

    Deine Idee funktioniert, sieht nur etwas seltsam aus!

    Der Code:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Nachricht
    2. 'Subübergreifende Variablen festlegen
    3. Public ticks As Integer = 0 'Soll später die Zeit zählen, in der die Form steht
    4. Public state As Integer = 0 'Legt fest ob die Form hoch/runter scrollt oder steht
    5. Private Sub Information_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    6. Me.Location = New Point(System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Width - Me.Width, System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Height)
    7. 'Legt die Position des Fensters fest
    8. Me.Size = New Size(Me.Width, 0)
    9. 'Fenster schrumpfen
    10. End Sub
    11. Private Sub tmr_Timer_Tick(sender As Object, e As EventArgs) Handles tmr_Timer.Tick
    12. Select Case state 'Überprüft den Status
    13. Case 0 'Scrollt hoch
    14. If Me.Size.Height = 241 Then 'Größe überprüfen
    15. state = 1 'Status ändern falls an Ziel
    16. Else
    17. Me.Size = New Size(Me.Width, Me.Height + 1) 'ansonsten neue Größe festlegen
    18. Me.Location = New Point(Me.Location.X, Me.Location.Y - 1) 'und neue Position
    19. End If
    20. Case 1 'Steht
    21. ticks = ticks + 1 'weiterzählen
    22. If ticks > 300 Then 'Zeit abgelaufen?
    23. state = 2 'Wenn ja, runterscrollen
    24. End If
    25. Case 2 'runterscrollen
    26. If Me.Size.Height = 0 Then 'Größe überprüfen
    27. tmr_Timer.Enabled = False
    28. Me.Close() 'Falls am Ziel, Timer aus und Form schließen
    29. Else
    30. Me.Size = New Size(Me.Width, Me.Height - 1) 'ansonsten neue Größe festlegen
    31. Me.Location = New Point(Me.Location.X, Me.Location.Y + 1) 'und neue Position
    32. End If
    33. End Select
    34. End Sub
    35. Private Sub MouseMoveOver(sender As Object, e As MouseEventArgs) Handles lb_Top.MouseMove, lb_fill.MouseMove 'Wenn Maus über Objekt bewegt wird
    36. If state = 2 Then 'und Form runterscrollt
    37. state = 0 'wieder hochscrollen
    38. ticks = 0 'und Timer zurücksetzen
    39. End If
    40. End Sub
    41. End Class


    Ums selbst anzusehen ersetzte einfach den Code des Forms "Nachricht" mit diesem!

    Übrigens vielen Dank das du mir so gut wie du kannst hilfst!
    Hey,

    stimmt ja.. Workingarea ist ja extra dafür da. Ich hätte es mal wieder etwas komplizierter gemacht :D
    Okay, sieht finde ich aber nicht all zu schlimm aus. Bis auf das ein Schwarzer Balken am Ende aus dem Bildschirm verschwindet ^^

    Bin leider gestern nicht dazu gekommen.

    Also ich denke mal, wenn man das Ziel, welches du erreichen wolltest (über der Taskleiste), realisieren möchte, müsste man ein wenig tricksen.
    Ich glaube man müsste die eigentliche Form erweitern, in die Höhe.
    Anschließend den Hintergrund der Form mit einer bestimmten Farbe hinterlegen und diese Farbe als TransparencyKey angeben. So hättest du die Möglichkeit die Controls (Dein HeaderPanel und TextPanel) nach oben (auf deiner Form) ticken zu lassen! :)
    Weißt du wie ich das meine?

    Leider komme ich noch nicht dazu, ansonsten hätte ich dir fix ein Beispiel gemacht.

    Grüße,
    Drahuverar
    Option Strict On!
    Habe mal ein wenig daran gearbeitet! Schaut an sich sehr gut aus! (Danke für den Tipp!)
    Kannst du mal nachsehen, ob du es irgendwie schafts das zittern im Taskleistenbereich, sowie den schwarzen Restbalken beim rausfahren zu entfernen?
    Dateien
    • Nachricht.zip

      (90,09 kB, 105 mal heruntergeladen, zuletzt: )
    Also bezüglich zittern; Vielleicht hilft die DoubleBuffered Eigenschaft, setz' die mal auf True.

    Mach mal noch folgendes bei Case 2 dabei:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. If Me.Location.Y = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height Then
    2. tmr_Timer.Enabled = False
    3. Me.Close()
    4. Else
    5. Me.Location = New Point(Me.Location.X, Me.Location.Y + 1)
    6. If Not Me.Location.Y > System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Height Then
    7. pcb_Transparenz.Size = New Size(pcb_Transparenz.Width, pcb_Transparenz.Height + 1)
    8. Opacity -= 0.005 'Verblassen :) Sieht geil aus!
    9. End If
    10. End If


    Sieht schöner aus. Beim Hochfahren würde ich nicht unbedingt mit Opacity spielen.

    Ich weiß nicht ob das ruckeln mit Forms vermieden werden kann, auf diese Weise!

    Ich helfe gerne. Fand das auch interessant.

    Drahuverar
    Option Strict On!

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

    Die DoubleBufferd Eigenschaft hilft leider nichts was das ruckeln angeht!
    Das mit der Traansparenz schaut aber nicht schlecht aus!

    Um das ruckeln zu entfernen bräuchte man einen paralellen Thread, da das ruckeln durch zwei Befehle erscheint, die gleichzeitig ablaufen müssten um zu verhindern das es ruckelt!

    Zum einen ist das die Zeile:

    VB.NET-Quellcode

    1. Me.Location = New Point(Me.Location.X, Me.Location.Y - 1)

    Und zum anderen die Zeile:

    VB.NET-Quellcode

    1. pcb_Transparenz.Size = New Size(pcb_Transparenz.Width, pcb_Transparenz.Height - 1)


    Das ruckeln erscheint dadurch, das die Form hochgezogen wird, und erst kurz dannach die Transparenz dieses hochgezogenen Streifens verschwindet! Das selbe Problem ist natürlich auch beim runterfahren!