2

我有一个表格,它应该将自己定位在屏幕的最右边,并在高度上伸展以填满工作区域的整个高度。

没什么太奇怪的,所以我用 写了一个解决方案Screen.WorkingArea.Height,只要我在本地运行就可以了。问题是在生产中表单是在Citrix环境中运行的,它似乎完全忽略了任务栏的高度。在 CitrixScreen.WorkingArea.Height中返回与 - 完全相同的值,Screen.Bounds.Height从而在任务栏下伸展自身。

我的想法是使用Screen.Bounds.Height(因为这似乎被正确返回)并自己减去任务栏高度。唯一的问题是我能找到的关于如何做到这一点的唯一例子Screen.Bounds.Height - Screen.WorkingArea.Height

那么如何直接访问任务栏的高度呢?(当然,我很乐意听取有关如何解决此问题的任何其他建议!)

4

1 回答 1

1

您还必须使用一些本机方法来访问任务栏的属性。

用法:

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/

于 2011-09-10T04:52:30.027 回答