WIN API-VFP取得任務欄的尺寸(寬度和高度)及位置

*!*     作者: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
位置: <<ICase(0=nPos,'左', 1=nPos,'頂', 2=nPos,'右', 3=nPos,'下', '浮動')>> (<<nLeft>>, <<nTop>>, <<nRight>>, <<nBottom>>)<<Space(3)>>
尺寸: <<nRight - nLeft>>, <<nBottom - nTop>>
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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章