WorkingArea berücksichtigt Taskleiste nicht

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von nikeee13.

    WorkingArea berücksichtigt Taskleiste nicht

    Ich verwende unter VB10 (VISTA) folgenden Code:

    SCREENHEIGHT = Screen.PrimaryScreen.Bounds.Height
    SCREENWORKHEIGHT = Screen.PrimaryScreen.WorkingArea.Height

    Da eine horizontale Taskleiste vorhanden ist, habe ich für die beiden Angaben verschiedene Wert erwartet. SCREENWORKHEIGHT müsste um die Höhe der Taskleiste geringer sein als SCREENHEIGHT. Tatsächlich sind beide Werte gleich 1080. Es handelt sich um einen 16:9-Bildschirm (1080 x 1920 Pixel).

    Irgendwo habe ich folgende Prozedur gefunden:

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim rWorkingArea As Rectangle = SystemInformation.WorkingArea
    Dim rScreen As Rectangle = SystemInformation.VirtualScreen
    Dim hTaskBar As Integer = rScreen.Height - rWorkingArea.Height
    MessageBox.Show(hTaskBar.ToString())
    End Sub


    Auch sie zeigt die Höhe der Taskbar mit 0 an.

    Wer hat eine Idee? ?(
    1. Du gönnst dir die Findwindow-Funktion:
    pinvoke.net/default.aspx/user32.findwindow

    2. Suchst nach "Shell_TrayWnd", 2. Parameter ist ein Emptystring.

    VB.NET-Quellcode

    1. FindWindow("Shell_TrayWnd", "")


    3. Zieh' dir den Rückgabewert davon in eine Variable. Das ist das Fensterhandle der Taskleiste.

    4. Klatsch das Handle in die GetWindowRect-Funktion:
    pinvoke.net/default.aspx/user32.getwindowrect
    (vorher noch den RECT-Typen als Structure definieren; die Definition findest du auch auf der Seite. Muss ggf. mit einem C#-To-VB-Converter konvertiert werden.)

    5. Die Position und Größe sind nun in dem referenzierten RECT. Das kannst du in ein System.Drawing.Rectangle konvertieren. Vielleicht kannst du das RECT auch weglassen und ein Rectangle verwenden. Müsste man ausprobieren.

    Oder:
    Da die Taskleiste immer auf dem Primärbildschirm ist, kannst du auch via Screen.PrimaryScreen.Bounds.Height und Screen.PrimaryScreen.WorkingArea.Height arbeiten.

    Beachte aber, dass die Taskleiste nicht immer unten oder oben sein muss. Manche User stellen sie auch nach links oder rechts. Deshalb wäre die erste Methode wohl angebrachter.

    Oder:
    Versuch es mal mit der Intersect-Methode.

    VB.NET-Quellcode

    1. Dim taksbar as rectangle = Rectangle.Intersect(Screen.PrimarySreen.Bounds, Screen.PrimaryScreen.WorkingArea)

    msdn.microsoft.com/en-us/library/fdh5beb9.aspx
    Von meinem iPhone gesendet

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

    Zu den Beiträgen

    Ich danke allen, die sich bemüht haben.

    Erfolgos ausprobiert habe ich die Sache mit Intersect. Das Intersect-Rechteck (Schnittmenge) hat die Parameter (0,0,1920,1080).

    Dann habe ich ausprobiert
    Dim hTaskBar As Integer = Screen.PrimaryScreen.Bounds.Height - Screen.PrimaryScreen.WorkingArea.Height
    Ergebnis: Die Taskbar hat die Höhe 0. Aber sie ist da und zu sehen.

    Die Sache mit FindWindow habe ich abgebrochen, weil ich keine zusätzliche DLL einbinden möchte. Das sollte doch VB10 irgendwie auch richtig können. Tatsächlich will es das ja auch, kanns aber scheinbar nicht.

    Laut MS: WorkingArea gibt immer den Arbeitsbereich des primären Bildschirms zurück. Den Arbeitsbereich eines Bildschirms in einer Umgebung mit mehreren Anzeigen erhalten Sie, indem Sie eine der Überladungen von Screen.GetWorkingArea aufrufen. Also habe ich auch noch ausprobiert:

    Dim taskbar As Rectangle = Screen.GetWorkingArea(Screen.PrimaryScreen.Bounds)

    Das ergibt ebenfalls (0,0,1920,1080).

    Für weitere Vorschläge bin ich offen, aber ich glaube, das ist was Prinzipielles. Mit allen möglichen Kommandos wird der Sachverhalt falsch wiedergegeben.
    KOmisch - bei mir arbeitet das 100% zuverlässig:

    VB.NET-Quellcode

    1. Private Sub Form_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    2. Dim output As New List(Of String)
    3. output.Add("Bounds: " & Screen.PrimaryScreen.Bounds.ToString)
    4. output.Add("WorkingArea: " & Screen.PrimaryScreen.WorkingArea.ToString)
    5. MessageBox.Show(String.Join(Environment.NewLine, output))
    6. End Sub
    Hallo,

    Woran liegt es? Ich habe die Ursache gefunden. Die Taskbar muss fixiert sein. Wenn sie nur sichtbar ist, dann wird sie auch von anderen Inhalten überschrieben, wenn sie fixiert ist, dann nicht. Das macht sogar Sinn.

    Aber auch etwas Angst. Alles wird ständig komplizierter. Habe gestern gerade gelesen, dass man 1999 eine Sonde für 250 Millionen am Mars vorbei geschossen hat, weil die Sodftware aus unterschiedlichen Komponenten bestand, die teils mit metrischen Messungen, teils mit amerikanischen Maßeinheiten gearbeitet hat.

    drschef schrieb:

    Die Sache mit FindWindow habe ich abgebrochen, weil ich keine zusätzliche DLL einbinden möchte. Das sollte doch VB10 irgendwie auch richtig können.
    Keine zusätzliche DLL? Die DLL wird so oder so vom Framework eingebunden. Ein Platform-Invoke mehr oder weniger richtet da nichts aus. Diese DLLs gibt es auf jedem Windows-Rechner, der nach 2000 aufgesetzt wurde (wahrscheinlich sogar noch früher!).

    Die FindWindow-Methode funktioniert unabhängig davon, in was für einem Modus sich die Taskleiste befindet, da direkt die Taskleiste vermessen wird, nicht irgendein reservierter Platz auf dem Bildschirm.

    Das könnte z. B. so aussehen:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Friend Module NativeMethods
    2. <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
    3. Public Function FindWindow(ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr
    4. End Function
    5. <DllImport("user32.dll")> _
    6. Public Function GetWindowRect(ByVal hWnd As IntPtr, ByRef lpRect As RECT) As Boolean
    7. End Function
    8. End Module
    9. <StructLayout(LayoutKind.Sequential)> _
    10. Public Structure RECT
    11. Public Left As Integer
    12. ' x position of upper-left corner
    13. Public Top As Integer
    14. ' y position of upper-left corner
    15. Public Right As Integer
    16. ' x position of lower-right corner
    17. Public Bottom As Integer
    18. ' y position of lower-right corner
    19. Public Function ToRectangle() as Rectangle
    20. Return Rectangle.FromLTRB(Left, Top, Right, Bottom)
    21. End Function
    22. End Structure
    23. '...
    24. Public Sub TaskleisteVermessen()
    25. Dim taskbarhandle as IntPtr = FindWindow("Shell_TrayWnd", "")
    26. if taskbarhandle = IntPtr.Zero then
    27. ' Keine Taskleiste da?
    28. Exit Sub
    29. End if
    30. Dim taskbarRect as RECT
    31. GetWindowRect(taskbarhandle, taskbarRect ) ' taskbarRect via Call By Reference übergeben; Es wird dann befüllt
    32. Dim taskbarDimensions as Rectangle = taskbarRect.ToRectangle()
    33. MessageBox.Show("Die Taskleiste: " & taskbarDimensions.ToString())
    34. End Sub


    (Habe den Code nicht getestet)

    Von meinem iPhone gesendet