1. 程式人生 > >用MASM32編寫全屏視窗程式

用MASM32編寫全屏視窗程式

 

;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; 檔名: FullScr.asm
; 作  者:Purple Endurer([email protected]
; 功 能: 演示程式在視窗模式和全屏模式間切換
; Date         log


;-------------------------------------------------
;2006-07-03    利用SetTimer()和GetAsyncKeyState()增加Esc鍵
;              作為從全屏切換回視窗模式的熱鍵!
;              在全屏模式下,視窗接收不到WM_KEYDOWN訊息!
;2006-06-30    建立!可在全屏和視窗模式間切換!
;              在一個國外MASM32論壇上,看到有網友討論如何用
;              MASM32編寫全屏視窗程式。於是在
;              用VC 6.0寫flash播放器——5、全屏播放

;              (http://blog.csdn.net/purpleendurer/archive/2005/12/07/545717.aspx)
;              的程式碼基礎上改寫。
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

.386
.model flatstdcall
option casemap:none
include /masm32/include/windows.inc

include /masm32/include/user32.inc
include /masm32/include/gdi32.inc
include /masm32/include/kernel32.inc
include /masm32/include/shell32.inc

includelib /masm32/lib/user32.lib
includelib /masm32/lib/gdi32.lib
includelib /masm32/lib/kernel32.lib
includelib /masm32/lib/shell32.lib

WinMain proto :DWORD, :DWORD, :DWORD, :DWORD
SetFullScr PROTO :HWND
SetWinMode PROTO :HWND
SwitchMode PROTO :HWND


m_m2m MACRO d1, d2
    push d2
    pop d1
ENDM

;.const
c_ButtonID equ 1
c_TimerID equ 1

.data
g_szWinClsName db "DemoWinClass", 0
g_szAppName  db "全屏顯示演示程式 by PurpleEndurer", 0
g_szBtnClsName db "button", 0
g_szFullScr db "全屏顯示!", 0
g_szSetWinMode db "視窗顯示! 按Esc鍵返回!", 0
g_szFailWinMode db "設定為視窗模式失敗!", 0
g_szFailFullScrMode db "設定為全屏模式失敗!", 0

g_bIsFull dword FALSE

.data?
g_hInstance HINSTANCE ?
g_hwndButton HANDLE ?
g_stOriginPos WINDOWPLACEMENT <>

.code
start:
    invoke GetModuleHandle, NULL
    mov    g_hInstance, eax
    invoke WinMain, g_hInstance, 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
    m_m2m   wc.cbSize, SIZEOF WNDCLASSEX
    m_m2m   wc.style, CS_HREDRAW or CS_VREDRAW
    m_m2m   wc.lpfnWndProc, OFFSET WndProc
    m_m2m   wc.cbClsExtra, NULL
    m_m2m   wc.cbWndExtra, NULL
    m_m2m   wc.hInstance, g_hInstance
    m_m2m   wc.hbrBackground, COLOR_WINDOW+1
    m_m2m   wc.lpszMenuName, NULL
    m_m2m   wc.lpszClassName, OFFSET g_szWinClsName
    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_szWinClsName, ADDR g_szAppName, /
           WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, /
           CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 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


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

    .ELSEIF uMsg==WM_CREATE
        ;建立按鈕
        invoke CreateWindowEx, NULL, ADDR g_szBtnClsName, ADDR g_szFullScr, /
                        WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON,/
                        25, 25, 560, 50, hWnd, c_ButtonID, g_hInstance, NULL
        mov  g_hwndButton, eax


    .ELSEIF uMsg==WM_COMMAND
        mov eax, wParam
        .IF lParam!=0
            .IF ax==c_ButtonID
                shr eax, 16
                .IF ax==BN_CLICKED
                        invoke SwitchMode, hWnd
                .ENDIF
            .ENDIF
        .ENDIF

    .ELSEIF uMsg==WM_TIMER
        invoke GetAsyncKeyState, VK_ESCAPE;Esc鍵
        test eax, 08000h
        jz @F
          invoke SwitchMode, hWnd

        @@:
    .ELSE
        invoke DefWindowProc, hWnd, uMsg, wParam, lParam
        ret
    .ENDIF
    xor eaxeax
    ret
WndProc endp


SwitchMode proc hWnd: HWND
    .if g_bIsFull==TRUE
        invoke KillTimer, hWnd, c_TimerID   ;清除定時器
        invoke SetWinMode, hWnd ;設定為視窗模式
        .IF eax==0
            invoke MessageBox, hWnd, ADDR g_szFailWinMode, ADDR g_szAppName, MB_ICONERROR
            ret
        .ENDIF
        m_m2m g_bIsFull, FALSE

        invoke SetWindowText, g_hwndButton, ADDR g_szFullScr    ;修改按鈕的文字
    .else
        invoke SetFullScr, hWnd ;設定為全屏模式
        .IF eax==0
            invoke MessageBox, hWnd, ADDR g_szFailFullScrMode, ADDR g_szAppName, MB_ICONERROR
            ret
        .ENDIF
        m_m2m g_bIsFull, TRUE

        invoke SetTimer, hWnd, c_TimerID, 100, NULL ;啟動定時器,以捕獲Esc鍵
        invoke SetWindowText, g_hwndButton, ADDR g_szSetWinMode ;修改按鈕的文字
    .endif

    ret
SwitchMode endp


;/////////////////////////////////////////////////////////////////////////
;功能:將hWnd指定的視窗切換到全屏模式
; 返回值:若失敗,eax=0;若成功,eax !=0
;/////////////////////////////////////////////////////////////////////////
SetFullScr PROC hWnd: HWND
    LOCAL hDC: HWND
    LOCAL dwHorzres, dwVertres: DWORD
    invoke GetWindowPlacement, hWnd, ADDR g_stOriginPos
    invoke GetWindowLong, hWnd, GWL_STYLE
    push edi
    mov edi, WS_CAPTION
    not edi
    and eaxedi
    push edi
    invoke SetWindowLong, hWnd, GWL_STYLE, eax;//去掉標題欄
    invoke GetDC, hWnd
    mov hDC, eax
    invoke GetDeviceCaps, hDC, HORZRES
    mov dwHorzres, eax
    invoke GetDeviceCaps, hDC, VERTRES
    mov dwVertres, eax
    xor eaxeax
    invoke MoveWindow, hWnd, eaxeax, dwHorzres, dwVertres, TRUE
    xor eaxeax
    invoke SetWindowPos, hWnd, HWND_TOPMOST, eaxeax, dwHorzres, dwVertres, SWP_SHOWWINDOW ;全屏顯示
    ret
SetFullScr ENDP


;/////////////////////////////////////////////////////////////////////////
; 功能:將hWnd指定的視窗切換到視窗模式

; 返回值:若失敗,eax=0;若成功,eax !=0
;/////////////////////////////////////////////////////////////////////////
SetWinMode PROC hWnd: HWND
    invoke GetWindowLong, hWnd, GWL_STYLE
    or eax, WS_CAPTION
    invoke SetWindowLong, hWnd, GWL_STYLE, eax  ;//恢復標題欄
    invoke ShowWindow, hWnd, SW_HIDE
    invoke SetWindowPlacement, hWnd, ADDR g_stOriginPos
    ret
SetWinMode ENDP

end start

相關推薦

MASM32編寫視窗程式

  ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

python編寫一個程式(背單詞)

大家好,我是一名即將畢業的大學生,第一次在CSDN上發表文章,之前在其他的部落格上也寫過,但是總的來說,這個平臺的資源要多一些(個人覺得),所以有很多不懂的地方希望大家多多指教。 今天我要給大家分享的是一款自己寫的屏保程式,大學嘛大家最頭疼的就是四六級的考試了,上次考試做閱讀的時候,情不

第2篇 Qt5基礎(二)編寫Qt多視窗程式

  1、通過程式碼來設定按鈕的中文文字會覆蓋以前在設計模式設定的文字,(另外,如果大家以前學過Qt 4,那麼現在可能會激動地發現不用在使用setCodecForTr()等函式就可以直接顯示中文了)不過,在程式碼中直接使用中文字不是一個好的習慣,建議在編寫程式時使用英文,當程式完成後使用

vscode編寫和執行matlab程式

vscode 擴充套件選擇 matlab-runner: 負責執行matlab; matlab: 負責編輯matlab程式碼,包含程式碼補全和命令提示 matlab-runner setting中設定 exe路徑、檔案路徑: "matlab.matlabpa

WindowBuilder編寫SWT 桌面應用程式

WindowBuilder是一款基於Eclipse平臺的雙向Java的GUI設計外掛式的軟體。它具備SWT/JFACE開發、Swing開發及GWT 開發三大功能,是一款不可多得的Java體系中的WYSIWYG工具。1 安裝WindowBuilder 可以從http://dow

JAVA編寫漢諾塔程式

漢諾塔問題:三根堅柱和一組中間有洞能在柱子上滑動的盤子,每個盤子有不同的直徑。初始時,所有的盤子按照大小依次堆放在一個柱子上,最大的盤子在最下面。 目標:將所有的盤子從初始的第一根柱子移動到第三根柱子

android超好基於zxing掃碼【詳細步驟】(一)

公司有個專案是這樣的:要求掃條形碼能識別上面的數字。於是選用了zxing進行掃碼,可一定要吐槽的是:太慢了,一個條形碼要掃5-10秒才能識別。於是換用了zbar進行掃碼。 zbar的速度很快,秒掃,但後面發現一個嚴重的問題,太不準了!不準到一個條形碼我能掃到好

Python編寫執行Hello World程式

簡介         我們將看一下如何用Python編寫執行一個傳統的“Hello World”程式。通過它,你將學會如何編寫、儲存和執行Python程式。          有兩種使用Python執行你的程式的方式——使用互動式的帶提示符的直譯器或使用原始檔。我們將學習這兩

vs2008編寫和除錯linux程式 ----VisualGDB 使用教程

一準備工作 1 準備一臺Linux機器用來編譯程式,我用的是虛擬機器安裝的CentOS網路設定成橋接模式      (1)安裝並開啟SSH      (2)安裝 gcc g++ gdb      (3)關閉防火牆或者開啟允許SSH對外訪問的網路埠 2下載 VisualGDB

記事本編寫第一個Java程式執行時 出現報錯:錯誤: 類helloworld是公共的, 應在名為 helloworld.java 的檔案中宣告 public class helloworld {

在書本上盲人摸象的摸索學習Java,Java環境配置完成,安裝好eclipse後,便興沖沖的去在記事本上編寫第一個Java程式,結果給破了一盆冷水,略懵        public class helloworld {public static void main(St

canvas實現背景冒泡動畫

class BGBubble { constructor(opts) { this.defaultOpts = { id: '', //容器ID num: 100,

vs2013qt編寫串列埠通訊程式

1. 檔案->新建專案-> QT5 project->QT application,命名為HelloSerialPort,點選確定,在彈出來的嚮導介面中選擇下一步->勾選openGL,下一步->點選finish 2. 在mai

C#編寫的Windows應用程式如何控制TextBox中只能輸入數字?

textbox有個KeyPress事件 把textbox改為對應的就可以用了:                 private   void   textBox_KeyPress(object   sender,   KeyPressEventArgs   e)     

python編寫ftp客戶端程式

#!/usr/bin/env python#author:Jims of www.ringkee.com#create date: 2005/02/05#description: Using ftplib module download a file from a ftp server.from ftplib

MFC編寫程式在別人電腦上顯示時視窗介面出現問題

最近自己用MFC寫的程式在別人電腦上顯示時,介面及控制元件的位置出現了問題,總體效果是各個特徵變大,導致介面不能正常顯示。開始一直以為是螢幕解析度的問題,可是調整解析度以後,問題沒有解決,查了些資料後

視窗程式做Java socket編寫聊天程式

服務端: import java.io.*; import java.net.*; import java.util.*; public class ChatServer { boolean started = false; ServerSocket ss = null

JS調命令實現F11

return ima logs key f11全屏 嘗試 ges div 500px <body onload =‘autoSetFull()‘> <button id=‘btn‘>全屏按鈕</button> <div

c編寫的一些程式

**1.列印100~200 之間的素數 ** 判斷一個數是否為一個素數,我呼叫<math.h>中的sqrt(x)的寫法,正是因為一個數的因數是成對出現的,所以開方後就只需要判斷它的前一半可以減少一些迴圈次數。 #include <stdio.h> #include

QT 子視窗退出

m_pWidget代表子視窗, 子視窗顯示全屏: m_pWidget->setWindowFlags(Qt::Dialog); m_pWidget->showFullScreen(); 子視窗退出全屏: m_pWidget->showNormal(); m_pWid

微信小程式自定義遮罩

效果如下: 1、wxml <view class='' bindtap='showMask'>顯示遮罩</view> <view class="mask" hidden="{{flag}}"> <view class="maskConten