⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sizer.asm

📁 windows sizer 汇编源代码
💻 ASM
字号:
      .386
      .model flat, stdcall
      option casemap :none   

      include \masm32\include\windows.inc
      include \masm32\include\user32.inc
      include \masm32\include\kernel32.inc
      includelib \masm32\lib\user32.lib
      includelib \masm32\lib\kernel32.lib
         
        WndProc  PROTO :DWORD,:DWORD,:DWORD,:DWORD   ;forward declare of used functions
        EnumProc PROTO :DWORD,:DWORD
        FindProc PROTO :HWND,:BOOL

    Subtract MACRO first,second                      ;Macros need through out the code
        mov eax,first
        sub eax,second
        mov first,eax
    ENDM
    LOWORD MACRO bigword
        mov  eax,bigword
        and  eax,0FFFFh
    ENDM
    HIWORD MACRO bigword
        mov eax,bigword
        shr eax,16
    ENDM     

    .data
      dlgname     db "MAIN",0
      szProgman   db "Program Manager",0
      szAbout     db "Coded by: Betrayed",13,10
                  db "Coded in: Asm(Masm)",13,10
                  db "E-mail: odin77@hotmail.com",13,10
                  db "Home page: http://betrayed.virtualave.net",0

      szPlease    db "Please select an item from the list box",0
      szMin       db "Window is minimized.",13,10
                  db "Would you like to restore it?",0
      szNoWin     db "Specified Window could not be found.",13,10
                  db "Refreshing Window list...",0
      szBadSize   db "Please Choose a non zero, numeric size.",0
      szTitle     db "Window Sizer",0

    .data? 
      hInstance   dd ?
      hList       dd ?
      ident       dd ?
      coorX       dd ?
      coorY       dd ?
      
    .code

start:


        invoke GetModuleHandle, NULL
        mov hInstance, eax        
        invoke DialogBoxParam,hInstance,ADDR dlgname,0,ADDR WndProc,0
        invoke ExitProcess,eax

WndProc proc hWin:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD

      .if uMsg == WM_INITDIALOG
            invoke LoadIcon,hInstance,100
            invoke SendMessage,hWin,WM_SETICON,1,eax
            invoke SetWindowPos,hWin,HWND_TOP+HWND_TOPMOST,NULL,NULL,NULL,NULL,SWP_NOMOVE+SWP_NOSIZE   ;window on top
            invoke GetDlgItem,hWin,1000                                     ;Get listbox
                mov hList,eax                                               ;save handle
            invoke EnumWindows,addr EnumProc,NULL                           ;enumerate the windows
            invoke SetFocus,hList                                           ;Set focus on the listbox
                xor eax,eax
                    ret
      .elseif uMsg == WM_COMMAND
        LOWORD wParam                                                       ;loword returns the id code
            .if eax == 3002                                                 ;close button
                invoke SendMessage,hWin,WM_CLOSE,NULL,NULL                  ;Close it
            .elseif eax == 3001                                             ;about button
                invoke MessageBox,hWin,addr szAbout,addr szTitle,MB_OK+MB_ICONINFORMATION
            .elseif eax == 2003                                             ;Set button
                invoke FindProc,hWin,TRUE                                   ;call findprco with true so it knows to set a new size
            .elseif eax == 3000                                             ;Refresh button
                invoke SendMessage,hList,LB_RESETCONTENT,NULL,NULL          ;Clear listbox
                invoke EnumWindows,addr EnumProc,NULL                       ;enumerate the windows
                invoke SetFocus,hList                                       ;set focus on the listbox
            .elseif eax == 1000                                             ;listbox
                HIWORD wParam                                               ;hiword shows the message sent  (fix from previous version)
                    .if eax ==  LBN_SELCHANGE                               ;if it is a change in the selection we want to know
                        invoke FindProc,hWin,FALSE                          ;Call findproc with false so we just update the sizebox
                    .endif
            .endif
            xor eax,eax
                ret
      .elseif uMsg == WM_CLOSE
        invoke ShowWindow,hWin,SW_MINIMIZE      ;just a little bit of end eyecandy =P
        invoke EndDialog,hWin,0
            xor eax,eax
            ret
      .endif
    xor eax,eax
    ret
WndProc endp

EnumProc proc eHandle:DWORD,y:DWORD

LOCAL buffer[1024]:BYTE
LOCAL un:DWORD

    invoke IsWindowVisible,eHandle      ;see if it is visble
    .if eax                             ;If it is go on
        invoke GetWindowText,eHandle,addr buffer,sizeof buffer   ;get the text
            .if eax                                              ;make sure it has text
                invoke lstrcmp,addr szProgman,addr buffer        ;compare it to the program manager
                    mov un,eax                                   ;save result
                invoke lstrcmp,addr szTitle,addr buffer          ;compare it to our title
                    .if !(un == 0 || eax == 0)                   ;If neither match go on
                        invoke SendMessage,hList,LB_ADDSTRING,NULL,addr buffer  ;and add it to the list box
                    .endif
            .endif
    .endif
    mov eax,eHandle                 ;enumerate until the handle is zero
        ret
EnumProc endp

FindProc proc hWnd:HWND,which:BOOL
LOCAL buffer2[1024]:BYTE
LOCAL IndexItem:DWORD
LOCAL handle:HWND
LOCAL rectWin:RECT

    invoke SendMessage,hList,LB_GETCURSEL,0,0       ;get the selection position
        mov IndexItem,eax                           ;save it
            .if eax != LB_ERR                       ;make sure something is selected
                invoke SendMessage,hList,LB_GETTEXT,IndexItem,ADDR buffer2  ;get the selected text
                    invoke FindWindow,NULL,addr buffer2                     ;use it to find the window
                        mov handle,eax                                      ;save the handle
                            .if eax != NULL                                 ;make sure we have a handle
                                .if which == TRUE                           ;see what we want to do with this function
                                    invoke IsIconic,handle                  ;since it was true we want to resize and we need to know if it is minimized
                                        .if !eax                            ;if it is not go on 
                                            invoke GetDlgItemInt,hWnd,2000,NULL,0   ;get width we want to resize to
                                                mov coorX,eax                       ;save it
                                            invoke GetDlgItemInt,hWnd,2001,NULL,0   ;get the height to resize to
                                                mov coorY,eax                       ;save it
                                                .if !(coorX==0 || coorY==0)         ;make sure neither is zero
                                                    invoke SetWindowPos,handle,NULL,0, 0, coorX, coorY, SWP_NOMOVE + SWP_NOZORDER ;resize the window
                                                .else
                                                    invoke MessageBox,hWnd,addr szBadSize,addr szTitle,MB_OK+MB_ICONSTOP ;if zero let the user know about it
                                                .endif
                                        .else
                                            invoke MessageBox,hWnd,addr szMin,addr szTitle,MB_YESNO+MB_ICONSTOP ;it is minimized
                                                .if eax == IDYES
                                                    invoke ShowWindow,handle,SW_RESTORE                         ;asked the user what to do if they chose restore 
                                                    invoke SendMessage,hWnd,WM_COMMAND,2003,NULL                ;and set the size again
                                                .endif
                                        .endif
                                .else                                                          ;which was false
                                    invoke GetWindowRect,handle,addr rectWin                   ;get the window rectangle   
                                        Subtract rectWin.right,rectWin.left                    ;Call the macro to subtract
                                        Subtract rectWin.bottom,rectWin.top                    ;Call the macro to subtract
                                            invoke SetDlgItemInt,hWnd,2000,rectWin.right,0     ;Set the size in the width box
                                            invoke SetDlgItemInt,hWnd,2001,rectWin.bottom,0    ;Set the size in the height box
                                .endif
                             .else
                                invoke MessageBox,hWnd,addr szNoWin,addr szTitle,MB_OK+MB_ICONEXCLAMATION   ;Window could not be found
                                invoke SendMessage,hWnd,WM_COMMAND,3000,NULL                                ;Refresh the list
                             .endif
             .else
                invoke MessageBox,hWnd,addr szPlease,addr szTitle,MB_OK+MB_ICONSTOP ;Nothing selected in the listbox
             .endif
xor eax,eax
    ret
FindProc endp
end start


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -