|
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Function: 计算并显示系统任务栏高度
; Author: PurpleEndurer
; DevEnv: Win XP SP2 + MASM32 v7
; log
; ----------------------------------------------------
; 2008-09-21 Created!
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
.386
.model flat, stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\kernel32.lib
include \masm32\include\user32.inc
includelib \masm32\lib\user32.lib
GetTaskBarHeight proto
.data
g_hHInstance HINSTANCE ?
g_szAppName db "系统任务栏高度", 0
g_szFmtPerD db "系统任务栏高度为:%d", 0
g_szBuf200 db 200 dup(0)
g_szFailtGetHeight db "未能取得!", 0
.code
start:
invoke GetModuleHandle, NULL
mov g_hHInstance, eax
invoke GetTaskBarHeight
inc eax
.if ZERO?
push MB_ICONERROR
push offset g_szAppName ;push for MessageBox()
push offset g_szFailtGetHeight ;push for MessageBox()
.else
dec eax
invoke wsprintf, addr g_szBuf200, addr g_szFmtPerD, eax
push MB_ICONINFORMATION ;push for MessageBox()
push offset g_szAppName ;push for MessageBox()
push offset g_szBuf200 ;push for MessageBox()
.endif
push NULL ;push for MessageBox()
call MessageBox
invoke ExitProcess, eax
;///////////////////////////////
;Fun: 计算系统任务栏高度
; In: (none)
;Out: 若失败eax=-1,否则eax=高度值
; //////////////////////////////
GetTaskBarHeight proc
local stDeskRect: RECT
;--- 取桌面工作区大小
invoke SystemParametersInfo, SPI_GETWORKAREA, NULL, addr stDeskRect, NULL
test eax, eax
.if !ZERO? ; 取得了吗?
;--- 如果桌面工作区左上角y坐标值不为零,
; 说明任务栏在屏幕上方
.IF stDeskRect.top != 0
mov eax, stDeskRect.top ;工作区左上角y坐标值即任务栏高度
.ELSE
;--- 取屏幕高度
invoke GetSystemMetrics, SM_CYSCREEN
test eax, eax
jz @GetTaskBarHeightFailRet ;未能取得
.if eax != stDeskRect.bottom
;---如果屏幕高度与桌面工作区右下角y坐标值相同,
; 那么任务栏在屏幕两侧,屏幕高度即任务栏高度
; 否则任务栏在屏幕下方,屏幕高度与桌面工作区右下角y坐标值之差即即任务栏高度
sub eax, stDeskRect.bottom
.endif
.ENDIF
.else
@GetTaskBarHeightFailRet:
mov eax, -1
.endif
ret
GetTaskBarHeight endp
end start |
|