当我们设定的强制休息时间到了,我们需要让强制休息程序窗口在顶层全屏显示,暂时把屏幕挡住,阻止用户操作。
让窗口全屏显示的一般步骤是:
1、用GetWindowPlacement()获取并保存窗口当前尺寸、位置信息
2、用GetWindowLong()取得用窗口属性,用SetWindowLong()去除窗口标题栏属性WS_CAPTION
3、用GetDeviceCaps()获取屏幕尺寸
4、用SetWindowPos()设置窗口全屏显示
还原到窗口模式的一般步骤是:
1、用GetWindowLong()取得用窗口属性,用SetWindowLong()为窗口加上标题栏属性WS_CAPTION
2、用SetWindowPlacement()将窗口恢复到全屏前的尺寸、位置
完整的演示程序可参考:
用MASM32编写全屏窗口程序
http://blog.youkuaiyun.com/Purpleendurer/archive/2006/07/03/871699.aspx
由于我们强制休息程序窗口使用了WS_POPUP风格,没有标题栏,实现起来就更简捷一些。
下面的演示程序允许用户在窗口上点击鼠标左键来进行窗口模式和全屏模式间的切换:
(源程序及可执行程序打包下载地址:http://download.youkuaiyun.com/source/657586)
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;Function:点击鼠标左键让演示程序在窗口模式和全屏模式间切换
;Author:PurpleEndurer
;DevEnv:WinXPSP2+MASM32v7
;log
;----------------------------------------------------
;2008-09-27Created!
;
;参考:用MASM32编写全屏窗口程序
;http://blog.youkuaiyun.com/Purpleendurer/archive/2006/07/03/871699.aspx
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
.386
.modelflat,stdcall
optioncasemap: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
WinMainproto:DWORD,:DWORD,:DWORD,:DWORD
SetWinToScrRightDownproto
SetFullScrModeproto
SetWinModeproto
;.const
c_isFullModeequ1b;窗口处于全屏模式标志
.data
g_szTimeWinClsNamedb"TimeWinCls",0
g_szAppNamedb"定时强制休息!",0
g_dwFlagdd0
;.data?
g_hHInstanceHINSTANCE?
g_hWndMainHWND?
g_stOriginPosWINDOWPLACEMENT<>;用于保存窗口模式时位置
.code
start:
invokeGetModuleHandle,NULL
movg_hHInstance,eax
invokeWinMain,g_hHInstance,NULL,NULL,SW_SHOWDEFAULT
invokeExitProcess,eax
WinMainprochInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
LOCALwc:WNDCLASSEX
LOCALmsg:MSG
LOCALhwnd:HWND
movwc.cbSize,SIZEOFWNDCLASSEX
movwc.style,CS_HREDRAWorCS_VREDRAW
movwc.lpfnWndProc,OFFSETWndProc
movwc.cbClsExtra,NULL
movwc.cbWndExtra,NULL
pushg_hHInstance
popwc.hInstance
movwc.hbrBackground,25
movwc.lpszMenuName,NULL
movwc.lpszClassName,OFFSETg_szTimeWinClsName
invokeLoadIcon,NULL,IDI_APPLICATION
movwc.hIcon,eax
movwc.hIconSm,eax
invokeLoadCursor,NULL,IDC_ARROW
movwc.hCursor,eax
invokeRegisterClassEx,addrwc
INVOKECreateWindowEx,NULL,ADDRg_szTimeWinClsName,ADDRg_szAppName/
,WS_POPUP,100,100,500,200,NULL,NULL,hInst,NULL
movhwnd,eax
invokeShowWindow,hwnd,SW_SHOWNORMAL
;invokeUpdateWindow,hwnd
.WHILETRUE
invokeGetMessage,ADDRmsg,NULL,0,0
.BREAK.IF(!eax)
invokeTranslateMessage,ADDRmsg
invokeDispatchMessage,ADDRmsg
.ENDW
moveax,msg.wParam
ret
WinMainendp
;///////////////////////////////////////////
;功能:让以g_hWndMain为句柄的窗口全屏显示
;输入:无
;输出:若失败,eax=0;若成功,eax!=0
;///////////////////////////////////////////
SetFullScrModePROC;hWnd:HWND
LOCALdwHorzres,dwVertres:DWORD
LOCALhDC:HDC
;---保存窗口当前位置以便恢复
invokeGetWindowPlacement,g_hWndMain,ADDRg_stOriginPos
invokeGetDC,g_hWndMain
movhDC,eax
;---取屏幕尺寸
invokeGetDeviceCaps,hDC,HORZRES
movdwHorzres,eax
invokeGetDeviceCaps,hDC,VERTRES
movdwVertres,eax
invokeReleaseDC,g_hWndMain,hDC
;---全屏显示
xoreax,eax
invokeSetWindowPos,g_hWndMain,HWND_TOPMOST/
,eax,eax,dwHorzres,dwVertres,SWP_SHOWWINDOW
ret
SetFullScrModeENDP
;/////////////////////////////////////////
;功能:恢复以g_hWndMain为句柄的窗口显示
;输入:无
;输出:若失败,eax=0;若成功,eax!=0
;/////////////////////////////////////////
SetWinModePROC;hWnd:HWND
invokeSetWindowPlacement,g_hWndMain,ADDRg_stOriginPos
ret
SetWinModeENDP
WndProcprochWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
.IFuMsg==WM_DESTROY
invokePostQuitMessage,NULL
.ELSEIFuMsg==WM_CREATE
moveax,hWnd
movg_hWndMain,eax
.ELSEIFuMsg==WM_LBUTTONDOWN
testg_dwFlag,c_isFullMode;窗口处于全屏模式吗?
.ifZERO?
invokeSetFullScrMode;否则置为全屏
org_dwFlag,c_isFullMode;置全屏标志
.else
invokeSetWinMode;是则返回窗口模式
andg_dwFlag,notc_isFullMode;取消全屏标志
.endif
.ELSE
invokeDefWindowProc,hWnd,uMsg,wParam,lParam
ret
.ENDIF
xoreax,eax
ret
WndProcendp
endstart