怎么取得任务栏的高度或宽度

subMain 2010-06-17 11:59:28
当使用“GetWindowRect”或“SHAppBarMessage”API函数取得任务栏的高度或宽度时,总提示“尝试读取或写入受保护的内存。这通常指示其他内存已损坏。”错误。
这是为什么?安全问吗?
怎么解决这个问题或使用其它方法来取得任务栏的高度或宽度?

Windows XP SP3
.NET Framework 2.0
...全文
576 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
dylike 2010-06-18
  • 打赏
  • 举报
回复
任务栏宽度就是屏幕宽度,不需要计算.
任务高度=屏幕高度-工作区高度
=
Screen.Bounds.Height-Screen.WorkArea.Height
古今多少事 2010-06-18
  • 打赏
  • 举报
回复
总觉得。NET有更好的获取方法。
古今多少事 2010-06-18
  • 打赏
  • 举报
回复
GetWindowRect结合Findwindows试试。
dylike 2010-06-18
  • 打赏
  • 举报
回复
    ''' <summary>
''' 任务栏
''' </summary>
''' <remarks></remarks>
Public Structure TaskBar
''' <summary>
''' 任务栏区域
''' </summary>
''' <remarks></remarks>
Public Bounds As Rectangle
''' <summary>
''' 任务栏方向
''' </summary>
''' <remarks></remarks>
Public DirectionF As Direction
''' <summary>
''' 任务栏方向
''' </summary>
''' <remarks></remarks>
Public Enum Direction
''' <summary>
''' 底
''' </summary>
''' <remarks></remarks>
Bottom = 0
''' <summary>
''' 左
''' </summary>
''' <remarks></remarks>
Left = 1
''' <summary>
''' 顶
''' </summary>
''' <remarks></remarks>
Top = 2
''' <summary>
''' 右
''' </summary>
''' <remarks></remarks>
Right = 3
End Enum
End Structure

Public Function GetTaskBarRect() As TaskBar
Try
Dim Tskb As New TaskBar
'获取主显示器工作区
Dim wRct As Rectangle = Screen.GetWorkingArea(New Point(0, 0))
'获取主显示器大小
Dim sRct As Rectangle = Screen.GetBounds(New Point(0, 0))
'判断左上角位置以确定任务栏方向
With wRct.Location
If .X = 0 AndAlso .Y = 0 AndAlso wRct.Width = sRct.Width Then
Tskb.DirectionF = TaskBar.Direction.Bottom
Tskb.Bounds.X = 0 : Tskb.Bounds.Y = 0 : Tskb.Bounds.Width = wRct.Width : Tskb.Bounds.Height = sRct.Height - wRct.Height
ElseIf .X > 0 Then
Tskb.DirectionF = TaskBar.Direction.Left
Tskb.Bounds.X = sRct.Width - wRct.Width : Tskb.Bounds.Y = 0 : Tskb.Bounds.Width = sRct.Width - wRct.Width : Tskb.Bounds.Height = wRct.Height
ElseIf .X = 0 AndAlso .Y > 0 Then
Tskb.DirectionF = TaskBar.Direction.Top
Tskb.Bounds.X = 0 : Tskb.Bounds.Y = sRct.Height - wRct.Height : Tskb.Bounds.Width = wRct.Width : Tskb.Bounds.Height = sRct.Height - wRct.Height
ElseIf .X = 0 AndAlso .Y = 0 AndAlso wRct.Width < sRct.Width Then
Tskb.DirectionF = TaskBar.Direction.Right
Tskb.Bounds.X = wRct.Right : Tskb.Bounds.Y = 0 : Tskb.Bounds.Width = wRct.Width : Tskb.Bounds.Height = wRct.Height
End If
End With
Return Tskb
Catch ex As Exception
End Try
End Function
dylike 2010-06-18
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 clonecenter 的回复:]
引用 3 楼 dylike 的回复:

任务栏宽度就是屏幕宽度,不需要计算.
任务高度=屏幕高度-工作区高度
=
Screen.Bounds.Height-Screen.WorkArea.Height

这样说的不全对,因为任务栏可以被拖拽到屏幕的四个方向,上下左右都有可能,只是通常都是在下面而已。
[/Quote]

Screen.Area工作区有个Bounds属性,这就告诉了你任务栏在什么方向.
zhsleep 2010-06-18
  • 打赏
  • 举报
回复

http://www.mndsoft.com/blog/article.asp?id=271

Option Explicit

Public Declare Function SystemParametersInfo Lib "user32" Alias "SystemParametersInfoA" (ByVal uAction As Long, ByVal uParam As Long, ByRef lpvParam As Any, ByVal fuWinIni As Long) As Long
Public Const SPI_GETWORKAREA = 48


Public Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type

Public Function GetTaskbarHeight() As Integer
Dim lRes As Long
Dim rectVal As RECT

lRes = SystemParametersInfo(SPI_GETWORKAREA, 0, rectVal, 0)
GetTaskbarHeight = ((Screen.Height / Screen.TwipsPerPixelX) - rectVal.Bottom) * Screen.TwipsPerPixelX
End Function
CloneCenter 2010-06-18
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 dylike 的回复:]

任务栏宽度就是屏幕宽度,不需要计算.
任务高度=屏幕高度-工作区高度
=
Screen.Bounds.Height-Screen.WorkArea.Height
[/Quote]
这样说的不全对,因为任务栏可以被拖拽到屏幕的四个方向,上下左右都有可能,只是通常都是在下面而已。
please_call_me_J 2010-06-18
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 dylike 的回复:]
VB.NET code
''' <summary>
''' 任务栏
''' </summary>
''' <remarks></remarks>
Public Structure TaskBar
''' <summary>
''' 任务栏区域
''' </summary>
''……
[/Quote]
顶。。。。
兔子-顾问 2010-06-18
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 dylike 的回复:]
任务栏宽度就是屏幕宽度,不需要计算.
任务高度=屏幕高度-工作区高度
=
Screen.Bounds.Height-Screen.WorkArea.Height
[/Quote]
+1

16,554

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧