Как определить высоту панели задач без использования Screen.WorkingArea? - PullRequest
2 голосов
/ 07 сентября 2011

У меня есть форма, которая должна располагаться у правого края экрана и растягиваться по высоте, чтобы заполнить всю высоту рабочей области.

Ничего странного в этом нет, поэтому я написал решение с использованием Screen.WorkingArea.Height, которое работало нормально, пока я работал локально. Загвоздка в том, что в производственной форме форма запускается в среде Citrix и, похоже, полностью игнорирует высоту панели задач. В Citrix Screen.WorkingArea.Height возвращает то же значение, что и Screen.Bounds.Height - таким образом, растягивается под панелью задач.

Моя идея состоит в том, чтобы использовать Screen.Bounds.Height (поскольку это, кажется, возвращается правильно) и вычитать высоту панели задач самостоятельно. Единственная проблема - единственные примеры, которые я могу найти о том, как это сделать, Screen.Bounds.Height - Screen.WorkingArea.Height.

Так как я могу получить доступ к высоте панели задач напрямую? (Конечно, я с удовольствием выслушаю любой другой совет, как обойти эту проблему!)

1 Ответ

1 голос
/ 10 сентября 2011

Вы должны будете использовать некоторые собственные методы, чтобы получить доступ к свойствам панели задач.

Использование:

TaskbarInfo.Height

Класс:

Public NotInheritable Class TaskbarInfo

    <DllImport("user32.dll", SetLastError:=True)> _
    Private Shared Function FindWindow(ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr
    End Function

    <DllImport("shell32.dll", SetLastError:=True)> _
    Public Shared Function SHAppBarMessage(ByVal dwMessage As ABM, <[In]()> ByRef pData As APPBARDATA) As IntPtr
    End Function

    Enum ABM As UInteger
        [New] = &H0
        Remove = &H1
        QueryPos = &H2
        SetPos = &H3
        GetState = &H4
        GetTaskbarPos = &H5
        Activate = &H6
        GetAutoHideBar = &H7
        SetAutoHideBar = &H8
        WindowPosChanged = &H9
        SetState = &HA
    End Enum

    Enum ABE As UInteger
        Left = 0
        Top = 1
        Right = 2
        Bottom = 3
    End Enum

    <StructLayout(LayoutKind.Sequential)> _
    Structure APPBARDATA
        Public cbSize As UInteger
        Public hWnd As IntPtr
        Public uCallbackMessage As UInteger
        Public uEdge As ABE
        Public rc As RECT
        Public lParam As Integer
    End Structure

    <StructLayout(LayoutKind.Sequential)> _
    Structure RECT
        Public left As Integer
        Public top As Integer
        Public right As Integer
        Public bottom As Integer
    End Structure

    Public Shared Function Height() As Integer
        Dim taskbarHandle As IntPtr = FindWindow("Shell_TrayWnd", Nothing)

        Dim data As New APPBARDATA()
        data.cbSize = CUInt(Marshal.SizeOf(GetType(APPBARDATA)))
        data.hWnd = taskbarHandle
        Dim result As IntPtr = SHAppBarMessage(ABM.GetTaskbarPos, data)

        If result = IntPtr.Zero Then
            Throw New InvalidOperationException()
        End If

        Return Rectangle.FromLTRB(data.rc.left, data.rc.top, data.rc.right, data.rc.bottom).Height
    End Function

End Class

Источник: http://winsharp93.wordpress.com/2009/06/29/find-out-size-and-position-of-the-taskbar/

...