一见面就调侃:WIN API

来源:百度文库 编辑:偶看新闻 时间:2024/04/29 21:37:55

WIN API-VFP取得任务栏的尺寸(宽度和高度)及位置

分类: VFP - API·WMI·ActiveX应用 Windows 2011-11-24 10:40 122人阅读 评论(0) 收藏 举报

*!*     作者:dkfdtf(方法一)、十豆三(方法二、方法三)
*!*     日期:2011-11-11
*!*  vfp版本:vfp9.0(SP2 7423)
*!* 操作系统:Windows XP(SP3)、Windows 7 32位(SP1)

*-- 方法一:by dkfdtf
*!* 取任务栏尺寸和位置可以直接用 SHAppBarMessage 函数来查询,
*!* 将消息参数 dwMessage 设为 ABM_GETTASKBARPOS,
*!* 返回时 pData 结构中 uEdge 成员就指示了任务栏的位置,
*!* rc 成员就是大小,具体用法请参见 MSDN。
*!* Windows 的任务栏还有自动隐藏,保持在其他窗口前面等特性,这些都需要用这个 api 来设置或查询。

#DefineABM_GETTASKBARPOS 0x00000005

Declare Long SHAppBarMessageIn shell32Long,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 ccTextmerge NoShow
位置: <> (<>, <>, <>, <>)<>
尺寸: <>, <>
Endtext
Messagebox(cc,64,'信息提示')
 

*!* 方法一的代码最好,大家学习及收藏这段代码吧。

*!* 下面2个方法可以用来学习取其他窗体的尺寸及坐标,对于任务栏,还是用推荐方法一。
 

*-- 方法二:先取得工作区尺寸,然后比较屏幕和工作区尺寸及坐标算出任务栏尺寸和位置。
*-- 工作区:是指屏幕上不被系统任务栏或应用程序桌面工具遮盖的部分。
Declare Integer SystemParametersInfoIn user32Integer uiAction,IntegeruiParam,String@pvParam,IntegerfWinIni
#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,'信息提示')
    Messagebox(;
        '工作区左上角 X 坐标:'+Transform(lnLeftUpX)+Chr(10)+;
        '工作区左上角 Y 坐标:'+Transform(lnLeftUpY)+Chr(10)+;
        '工作区右下角 X 坐标:'+Transform(lnRightDownX)+Chr(10)+;
        '工作区右下角 Y 坐标:'+Transform(lnRightDownY)+Chr(10),64,'信息提示')
Endif
 

*-- 方法三:先取得任务栏尺寸,然后比较屏幕和任务栏尺寸及坐标算出任务栏位置。
Declare Integer GetWindowRectIn user32Integer hWindow,String@lpRect
Declare Integer FindWindowIn user32String lpClassName,StringlpWindowName
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,'信息提示')
        Messagebox(;
            '任务栏左上角 X 坐标:'+Transform(lnLeftUpX)+Chr(10)+;
            '任务栏左上角 Y 坐标:'+Transform(lnLeftUpY)+Chr(10)+;
            '任务栏右下角 X 坐标:'+Transform(lnRightDownX)+Chr(10)+;
            '任务栏右下角 Y 坐标:'+Transform(lnRightDownY)+Chr(10),64,'信息提示')
    Endif
Endif