[分享及讨论]WIN API-VFP取得任务栏的尺寸(宽度和高度)及位置

十豆三 2011-10-29 01:52:07
*-- 环境:vfp9.0(SP2 7423),Windows XP(SP3)、Windows 7 32位(SP1)
*-- 方法一:先取得工作区尺寸,然后比较屏幕和工作区尺寸及坐标算出任务栏尺寸和位置。
*-- 工作区:是指屏幕上不被系统任务栏或应用程序桌面工具遮盖的部分。
Declare Integer SystemParametersInfo In user32 Integer uiAction,Integer uiParam,String @pvParam,Integer fWinIni
#Define SPI_GETWORKAREA 48
lcpvParam=Replicate(Chr(0),16)
If SystemParametersInfo(SPI_GETWORKAREA,0,@lcpvParam,0)#0 && 获取工作区尺寸
lnLeftUpX=CToBin(Substr(lcpvParam,1,4),'4rs') && 工作区左上角 X 坐标
lnLeftUpY=CToBin(Substr(lcpvParam,5,4),'4rs') && 工作区左上角 Y 坐标
lnRightDownX=CToBin(Substr(lcpvParam,9,4),'4rs') && 工作区右下角 X 坐标
lnRightDownY=CToBin(Substr(lcpvParam,13,4),'4rs') && 工作区右下角 Y 坐标
If Sysmetric(1)=lnRightDownX-lnLeftUpX && 判断任务栏位置是 上 或 下(屏幕宽度=工作区宽度 说明任务栏位置是 上 或 下)
lnTrayWidth=Sysmetric(1) && 任务栏宽度=屏幕宽度
lnTrayHeight=Sysmetric(2)-(lnRightDownY-lnLeftUpY) && 任务栏高度=屏幕高度-工作区高度
If lnLeftUpY=0 && 如果工作区左上角 Y 坐标为0,说明任务栏位置为 下,否则为 上
lcTrayOrientation='下'
Else
lcTrayOrientation='上'
Endif
Else && 任务栏位置是 左 或 右
lnTrayWidth=Sysmetric(1)-(lnRightDownX-lnLeftUpX) && 任务栏宽度=屏幕宽度-工作区宽度
lnTrayHeight=Sysmetric(2) && 任务栏高度=屏幕高度
If lnLeftUpX=0 && 如果工作区左上角 X 坐标为0,说明任务栏位置为 右,否则为 左
lcTrayOrientation='右'
Else
lcTrayOrientation='左'
Endif
Endif
Messagebox('任务栏尺寸:'+Transform(lnTrayWidth)+'×'+Transform(lnTrayHeight)+Space(3)+Chr(10)+'任务栏位置:'+lcTrayOrientation,64,'信息提示')
Endif


*-- 方法二:先取得任务栏尺寸,然后比较屏幕和任务栏尺寸及坐标算出任务栏位置。
Declare Integer GetWindowRect In user32 Integer hWindow,String @lpRect
Declare Integer FindWindow In user32 String lpClassName,String lpWindowName
lnHWnd=FindWindow('Shell_traywnd','')
If lnHWnd>0
lcRect=Replicate(Chr(0),16)
If GetWindowRect(lnHWnd,@lcRect)#0 && 获取任务栏尺寸
lnLeftUpX=CToBin(Substr(lcRect,1,4),'4rs') && 任务栏左上角 X 坐标
lnLeftUpY=CToBin(Substr(lcRect,5,4),'4rs') && 任务栏左上角 Y 坐标
lnRightDownX=CToBin(Substr(lcRect,9,4),'4rs') && 任务栏右下角 X 坐标
lnRightDownY=CToBin(Substr(lcRect,13,4),'4rs') && 任务栏右下角 Y 坐标
lnTrayWidth=lnRightDownX-lnLeftUpX && 任务栏宽度=右下角 X 坐标-左上角 X 坐标
lnTrayHeight=lnRightDownY-lnLeftUpY && 任务栏高度=右下角 Y 坐标-左上角 Y 坐标
If Sysmetric(1)=lnTrayWidth && 判断任务栏位置是 上 或 下(屏幕宽度=任务栏宽度 说明任务栏位置是 上 或 下)
If lnLeftUpY=0 && 如果任务栏左上角 Y 坐标为0,说明任务栏位置为 上,否则为 下
lcTrayOrientation='上'
Else
lcTrayOrientation='下'
Endif
Else && 任务栏位置是 左 或 右
If lnLeftUpX=0 && 如果任务栏左上角 X 坐标为0,说明任务栏位置为 左,否则为 右
lcTrayOrientation='左'
Else
lcTrayOrientation='右'
Endif
Endif
Messagebox('任务栏尺寸:'+Transform(lnTrayWidth)+'×'+Transform(lnTrayHeight)+Space(3)+Chr(10)+'任务栏位置:'+lcTrayOrientation,64,'信息提示')
Endif
Endif
...全文
623 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
十豆三 2011-11-11
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 taohua300 的回复:]
在任务栏使用小图标的情况下

任务栏的高度固定为 30
[/Quote]

尺寸不会错的。你用QQ截图功能,鼠标移到此处就能自动看到尺寸的。
十豆三 2011-11-11
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 taohua300 的回复:]
我用FastStone

任务栏为小图标时高度为30

任务栏为大图标时高度为40

总之

以上三段代码是能正确执行的
[/Quote]
好的,能正常执行说明兼容 Windows 7,多谢!
taohua300 2011-11-11
  • 打赏
  • 举报
回复
我用FastStone

任务栏为小图标时高度为30

任务栏为大图标时高度为40

总之

以上三段代码是能正确执行的
taohua300 2011-11-10
  • 打赏
  • 举报
回复
在任务栏使用小图标的情况下

任务栏的高度固定为 30
taohua300 2011-11-10
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 apple_8180 的回复:]

引用 14 楼 taohua300 的回复:
以管理员身份运行
OK


多谢帮忙测试。
[/Quote]

豆老师,我说的是汉化包用管理员的身份运行,就能安装了
十豆三 2011-11-10
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 taohua300 的回复:]
以管理员身份运行
OK
[/Quote]

多谢帮忙测试。
taohua300 2011-11-09
  • 打赏
  • 举报
回复
以管理员身份运行

OK
taohua300 2011-11-09
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 apple_8180 的回复:]

不管在是 Win7 下,还是 XP下,尽量不要用汉化版。
[/Quote]

尽管天天面对英文

还是不习惯

可能更多的时候使用的vs都是中文的缘故
十豆三 2011-11-09
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 taohua300 的回复:]
win7测试如下

1. 三种方法测试的结果是一样的

2. 在不同的分辨率下

结果为 横像素 * 40

例如 在 1024 * 768 下

任务栏为 1024 * 40

总之就是任务栏的高度是一定的

另 win7 下sp2 如何汉化啊

我的汉化包在win7下运行咋没有反应呢
[/Quote]

多谢在 Win7 下测试。

不管在是 Win7 下,还是 XP下,尽量不要用汉化版。
taohua300 2011-11-09
  • 打赏
  • 举报
回复


我的是win7 32位 sp1
taohua300 2011-11-09
  • 打赏
  • 举报
回复
win7测试如下

1. 三种方法测试的结果是一样的

2. 在不同的分辨率下

结果为 横像素 * 40

例如 在 1024 * 768 下

任务栏为 1024 * 40

总之就是任务栏的高度是一定的

另 win7 下sp2 如何汉化啊

我的汉化包在win7下运行咋没有反应呢
十豆三 2011-11-08
  • 打赏
  • 举报
回复
没有使用 Win7 的网友吗?请帮助测试并回复一下。谢谢。
yrt888 2011-10-31
  • 打赏
  • 举报
回复
收藏了,谢谢两位老师!
十豆三 2011-10-31
  • 打赏
  • 举报
回复
5楼 dkfdtf 版主的代码最好,大家学习及收藏这段代码吧。
另外请使用 WIN7 的网友测试一下这段代码并反馈上来,多谢!

更要感谢 dkfdtf 版主。

我的代码可以用来学习取其他窗体的尺寸及坐标。
都市夜猫 2011-10-30
  • 打赏
  • 举报
回复
取任务栏尺寸和位置可以直接用 SHAppBarMessage 函数来查询,将消息参数 dwMessage 设为 ABM_GETTASKBARPOS, 返回时 pData 结构中 uEdge 成员就指示了任务栏的位置,rc 成员就是大小,具体用法请参见 MSDN。Windows 的任务栏还有自动隐藏,保持在其他窗口前面等特性,这些都需要用这个 api 来设置或查询。

*-- 方法三
#define ABM_GETTASKBARPOS 0x00000005

Declare Long SHAppBarMessage in shell32 Long, String @

cc = Replicate(Chr(0), 32)
cc = BinToC(4+Len(cc), 'rs') + cc
SHAppBarMessage(ABM_GETTASKBARPOS, @ cc)

nPos = CToBin(Substr(cc,13+0,4), 'rs')
nLeft = CToBin(Substr(cc,13+4,4), 'rs')
nTop = CToBin(Substr(cc,13+8,4), 'rs')
nRight = CToBin(Substr(cc,13+12,4), 'rs')
nBottom = CToBin(Substr(cc,13+16,4), 'rs')
Text to cc Textmerge
位置: <<ICase(0=nPos,'左', 1=nPos,'顶', 2=nPos,'右', 3=nPos,'下', '浮动')>> (<<nLeft>>, <<nTop>>, <<nRight>>, <<nBottom>>)
尺寸: <<nRight - nLeft>>, <<nBottom - nTop>>
EndText
MessageBox(cc)
dawugui 2011-10-30
  • 打赏
  • 举报
回复
我是进来看看的,十年前用过VF6写过程序,后来没用了.
hil2000 2011-10-30
  • 打赏
  • 举报
回复
学习了,支持十豆三和dkfdtf两位大侠!
-晴天 2011-10-29
  • 打赏
  • 举报
回复
真不错!
yrt888 2011-10-29
  • 打赏
  • 举报
回复
很好,行者孙的博客已经不更新了,现在在这里继续学习了!顶!
十豆三 2011-10-29
  • 打赏
  • 举报
回复
讨论:
有网友问在 XP 和 WIN7 下取得任务栏高度和所在位置,原帖在这里:
http://topic.csdn.net/u/20111029/00/8e42519f-a8ee-462e-85a4-45f3ff96a4bc.html
我只在 XP 下测试通过,请有 WIN7 环境的网友帮忙测试一下,并将测试结果反映上来,
如果 WIN7 下有问题,最好将解决方法也帖上来,多谢


结论:
经网友 taohua300 的测试,在 Windows 7 32位(SP1)下可以正常执行,多谢!

2,749

社区成员

发帖
与我相关
我的任务
社区描述
VFP,是Microsoft公司推出的数据库开发软件,用它来开发数据库,既简单又方便。
社区管理员
  • VFP社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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