当我们设定的强制休息时间到了,我们需要让强制休息程序窗口在顶层全屏显示,暂时把屏幕挡住,阻止用户操作。

 

让窗口全屏显示的一般步骤是:

 

1、用GetWindowPlacement()获取并保存窗口当前尺寸、位置信息
2、用GetWindowLong()取得用窗口属性,用SetWindowLong()去除窗口标题栏属性WS_CAPTION
3、用GetDeviceCaps()获取屏幕尺寸
4、用SetWindowPos()设置窗口全屏显示

 

还原到窗口模式的一般步骤是:

 

1、用GetWindowLong()取得用窗口属性,用SetWindowLong()为窗口加上标题栏属性WS_CAPTION
2、用SetWindowPlacement()将窗口恢复到全屏前的尺寸、位置

 

完整的演示程序可参考:

用MASM32编写全屏窗口程序​

由于我们强制休息程序窗口使用了WS_POPUP风格,没有标题栏,实现起来就更简捷一些。

 

下面的演示程序允许用户在窗口上点击鼠标左键来进行窗口模式和全屏模式间的切换:

 

(源程序及可执行程序打包下载地址)

 

;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Function: 点击鼠标左键让演示程序在窗口模式和全屏模式间切换
; Author: PurpleEndurer
; DevEnv: Win XP SP2 + MASM32 v7
; log
; ----------------------------------------------------
; 2008-09-27 Created!
;
;参考: 用MASM32编写全屏窗口程序
;javascript:void(0)
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

.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

include /masm32/include/gdi32.inc
includelib /masm32/lib/gdi32.lib

WinMain proto :DWORD, :DWORD, :DWORD, :DWORD
SetWinToScrRightDown proto
SetFullScrMode proto
SetWinMode proto

;.const
c_isFullMode equ 1b ;窗口处于全屏模式标志

.data
g_szTimeWinClsName db "TimeWinCls", 0
g_szAppName db "定时强制休息!", 0

g_dwFlag dd 0

;.data?
g_hHInstance HINSTANCE ?
g_hWndMain HWND ?
g_stOriginPos WINDOWPLACEMENT <> ;用于保存窗口模式时位置

.code
start:
invoke GetModuleHandle, NULL
mov g_hHInstance, eax
invoke WinMain, g_hHInstance, NULL, NULL, SW_SHOWDEFAULT
invoke ExitProcess, eax

WinMain proc hInst:HINSTANCE, hPrevInst:HINSTANCE, CmdLine:LPSTR, CmdShow:DWORD
LOCAL wc: WNDCLASSEX
LOCAL msg: MSG
LOCAL hwnd: HWND

mov wc.cbSize, SIZEOF WNDCLASSEX
mov wc.style, CS_HREDRAW or CS_VREDRAW
mov wc.lpfnWndProc, OFFSET WndProc
mov wc.cbClsExtra, NULL
mov wc.cbWndExtra, NULL
push g_hHInstance
pop wc.hInstance
mov wc.hbrBackground, 25
mov wc.lpszMenuName, NULL
mov wc.lpszClassName, OFFSET g_szTimeWinClsName
invoke LoadIcon, NULL, IDI_APPLICATION
mov wc.hIcon, eax
mov wc.hIconSm, eax
invoke LoadCursor, NULL, IDC_ARROW
mov wc.hCursor, eax
invoke RegisterClassEx, addr wc
INVOKE CreateWindowEx, NULL, ADDR g_szTimeWinClsName, ADDR g_szAppName/
, WS_POPUP, 100,100, 500, 200, NULL, NULL, hInst, NULL
mov hwnd, eax
invoke ShowWindow, hwnd, SW_SHOWNORMAL
;invoke UpdateWindow, hwnd
.WHILE TRUE
invoke GetMessage, ADDR msg, NULL, 0, 0
.BREAK .IF (!eax)
invoke TranslateMessage, ADDR msg
invoke DispatchMessage, ADDR msg
.ENDW
mov eax, msg.wParam
ret
WinMain endp


;///
; 功能:让以g_hWndMain为句柄的窗口全屏显示
; 输入: 无
; 输出: 若失败,eax=0;若成功,eax !=0
;///
SetFullScrMode PROC ;hWnd: HWND
LOCAL dwHorzres, dwVertres: DWORD
LOCAL hDC: HDC

;--- 保存窗口当前位置以便恢复
invoke GetWindowPlacement, g_hWndMain, ADDR g_stOriginPos

invoke GetDC, g_hWndMain
mov hDC, eax

;--- 取屏幕尺寸
invoke GetDeviceCaps, hDC, HORZRES
mov dwHorzres, eax

invoke GetDeviceCaps, hDC, VERTRES
mov dwVertres, eax

invoke ReleaseDC, g_hWndMain, hDC

;--- 全屏显示
xor eax, eax
invoke SetWindowPos, g_hWndMain, HWND_TOPMOST/
, eax, eax, dwHorzres, dwVertres, SWP_SHOWWINDOW
ret
SetFullScrMode ENDP


;/
; 功能: 恢复以g_hWndMain为句柄的窗口显示
; 输入: 无
; 输出: 若失败,eax=0;若成功,eax !=0
;/
SetWinMode PROC ;hWnd: HWND
invoke SetWindowPlacement, g_hWndMain, ADDR g_stOriginPos
ret
SetWinMode ENDP

WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
.IF uMsg==WM_DESTROY
invoke PostQuitMessage, NULL

.ELSEIF uMsg==WM_CREATE
mov eax, hWnd
mov g_hWndMain, eax

.ELSEIF uMsg==WM_LBUTTONDOWN
test g_dwFlag, c_isFullMode ;窗口处于全屏模式吗?
.if ZERO?
invoke SetFullScrMode ; 否则置为全屏
or g_dwFlag, c_isFullMode ; 置全屏标志
.else
invoke SetWinMode ;是则返回窗口模式
and g_dwFlag, not c_isFullMode ;取消全屏标志
.endif
.ELSE
invoke DefWindowProc, hWnd, uMsg, wParam, lParam
ret
.ENDIF

xor eax, eax
ret
WndProc endp
end