MASM32编程演示程序在窗口模式和全屏模式间切换

简介: MASM32编程演示程序在窗口模式和全屏模式间切换

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

 

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

 

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
相关文章
[07-04] 用MASM32编写全屏窗口程序
[07-04] 用MASM32编写全屏窗口程序
|
数据可视化
PyQt5-如何设置主窗口居中?退出应用程序如何操作?
PyQt5-如何设置主窗口居中?退出应用程序如何操作?
106 0
win11取消右键菜单折叠恢复经典传统菜单模式方法解决
win11取消右键菜单折叠恢复经典传统菜单模式方法解决
523 0
|
C# Windows
推荐一个C#开发的窗口扩展菜单,支持系统所有窗口
一个C#开发的窗口扩展项目,采用.NET Framework 4.0开发,支持Windows Xp以及更高版本的系统,同时支持命令模式,可供代码调用。
134 0
推荐一个C#开发的窗口扩展菜单,支持系统所有窗口
|
Windows
【Windows 逆向】OD 调试器工具 ( 显示模块窗口 | 显示记录窗口 | 显示内存窗口 | 显示线程 | 显示句柄 | 显示 CPU | 多窗口界面 )(一)
【Windows 逆向】OD 调试器工具 ( 显示模块窗口 | 显示记录窗口 | 显示内存窗口 | 显示线程 | 显示句柄 | 显示 CPU | 多窗口界面 )(一)
346 0
【Windows 逆向】OD 调试器工具 ( 显示模块窗口 | 显示记录窗口 | 显示内存窗口 | 显示线程 | 显示句柄 | 显示 CPU | 多窗口界面 )(一)
|
Windows
【Windows 逆向】OD 调试器工具 ( 显示模块窗口 | 显示记录窗口 | 显示内存窗口 | 显示线程 | 显示句柄 | 显示 CPU | 多窗口界面 )(二)
【Windows 逆向】OD 调试器工具 ( 显示模块窗口 | 显示记录窗口 | 显示内存窗口 | 显示线程 | 显示句柄 | 显示 CPU | 多窗口界面 )(二)
374 0
【Windows 逆向】OD 调试器工具 ( 显示模块窗口 | 显示记录窗口 | 显示内存窗口 | 显示线程 | 显示句柄 | 显示 CPU | 多窗口界面 )(二)
Qt实用技巧:将QWidget作为输入窗口,接收键盘消息、输入法并且控制输入法悬浮工具栏位置控制
Qt实用技巧:将QWidget作为输入窗口,接收键盘消息、输入法并且控制输入法悬浮工具栏位置控制
QT软件开发: 打开的窗口默认处于屏幕中间
QT软件开发: 打开的窗口默认处于屏幕中间
265 0
QT软件开发: 打开的窗口默认处于屏幕中间
QT软件开发: 窗口打开固定在屏幕中间或者右下角
QT软件开发: 窗口打开固定在屏幕中间或者右下角
403 0
|
API Windows
万能脚本录制工具VIP版本(支持鼠标/键盘 前台/后台按键 支持模式更多更强大)
前言:鉴于很多朋友没有编程基础,无法自己制作脚本。本人编写了一款集录制脚本与执行脚本于一体的程序,并调用了大漠插件免费版本。使没有编程基础的同学也能制作自己的脚本。并引起了很多朋友的喜爱。并希望兼容更多的绑定模式。
5065 0
万能脚本录制工具VIP版本(支持鼠标/键盘 前台/后台按键 支持模式更多更强大)