当我们设定的强制休息时间到了,我们需要让强制休息程序窗口在顶层全屏显示,暂时把屏幕挡住,阻止用户操作。
让窗口全屏显示的一般步骤是:
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