金鳞化龙 - 老白


智者创造机会,强者把握机会,弱者等待机会~
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

一个清除广告窗口的WIN32ASM源程序(for win2k)

Posted on 2005-11-17 22:03  秋衫客  阅读(474)  评论(1)    收藏  举报
.586
.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\shell32.inc
include \MASM32\INCLUDE\Comctl32.inc
include \MASM32\INCLUDE\comdlg32.inc
include \MASM32\include\oleaut32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\shell32.lib
includelib \MASM32\LIB\comdlg32.lib
includelib \MASM32\LIB\Comctl32.lib
includelib \MASM32\LIB\oleaut32.lib
stralloc MACRO ln
        invoke SysAllocStringByteLen,0,ln
      ENDM
WM_SHELLNOTIFY equ WM_USER+5
IDI_TRAY equ 0
IDM_RESTORE equ 1000
IDM_ABOUT equ 1020
IDM_EXIT   equ 1010
WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD
EnumProc PROTO :DWORD,:DWORD
EnumChildProc PROTO :DWORD,:DWORD

.data
ClassName    db "TrayIconWinClass",0
AppName        db "广告窗口消除程序 NoAd v1.0",0
RestoreString   db "设置",0
about_1           db "关于",0  
ExitString       db "退出",0
dir  db "NoAd v1.0",0
pars db "盛玉增版权所有",8 dup(0)
szNameFile db "danci.lib",0

OurText  db "广告窗口消除程序 NoAd v1.0  作者:盛玉增  用汇编语言编制 2002.10.18",0
text1 db 200 dup (0)
text2 db 200 dup (0)
icon1 db "BOOK1.ICO",0
buffer db 1024 dup(0)
buffer_c db 1024 dup(0)

.data?
esi_1 dd ?
edx_1 dd ?
br dd ?
source$   dd ?
ln  dd ?
hFile dd ?
hnd1 dd ?
hInstance   dd ?
note NOTIFYICONDATA <>
hPopupMenu   dd ?
phand dd ?

.code
start:
      invoke MessageBox,0,ADDR OurText,ADDR dir,MB_OK
   invoke GetModuleHandle, NULL

   mov    hInstance,eax
   invoke WinMain, 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
   mov   wc.cbSize,SIZEOF WNDCLASSEX
   mov   wc.style, CS_HREDRAW or CS_VREDRAW or CS_DBLCLKS
   mov   wc.lpfnWndProc, OFFSET WndProc
   mov   wc.cbClsExtra,NULL
   mov   wc.cbWndExtra,NULL
   push  hInst
   pop   wc.hInstance
   ;mov   wc.hbrBackground,COLOR_APPWORKSPACE
      mov   wc.hbrBackground,COLOR_WINDOW+1
   mov   wc.lpszMenuName,NULL
   mov   wc.lpszClassName,OFFSET ClassName
   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,WS_EX_CLIENTEDGE,ADDR ClassName,ADDR AppName,\
          WS_OVERLAPPED+WS_CAPTION+WS_SYSMENU+WS_MINIMIZEBOX+WS_VISIBLE,CW_USEDEFAULT,\
           CW_USEDEFAULT,600,80,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
   LOCAL pt:POINT
      LOCAL hdc:HDC
   LOCAL ps:PAINTSTRUCT
   LOCAL rect:RECT
   
   
   .if uMsg==WM_CREATE
      invoke CreatePopupMenu
      mov hPopupMenu,eax
   ;   invoke AppendMenu,hPopupMenu,MF_STRING,IDM_RESTORE,addr RestoreString
      invoke AppendMenu,hPopupMenu,MF_STRING,IDM_ABOUT,addr about_1
            invoke AppendMenu,hPopupMenu,MF_STRING,IDM_EXIT,addr ExitString
            invoke GetForegroundWindow
            mov hnd1,eax
            invoke  GetWindowText,hnd1,ADDR text1,100
            invoke   SetTimer,hWnd,1,500,NULL
    

   .elseif uMsg==WM_DESTROY
              invoke   KillTimer,hWnd,1
      invoke PostQuitMessage,NULL
      .elseif   uMsg == WM_TIMER
                               push esi
                               push edi
                               invoke EnumWindows,addr EnumProc,NULL  
                              
        nx_1_1:pop edi
               pop esi
       .ELSEIF uMsg==WM_PAINT
    ;   invoke BeginPaint,hWnd, ADDR ps
    ;   mov    hdc,eax
    ;   invoke GetClientRect,hWnd, ADDR rect
    ;   invoke DrawText, hdc,ADDR OurText,-1, ADDR rect, DT_SINGLELINE or DT_CENTER or DT_VCENTER
    ;   invoke EndPaint,hWnd, ADDR ps
            invoke SendMessage, hWnd, WM_SIZE,SIZE_MINIMIZED,0  
              

   .elseif uMsg==WM_SIZE
      .if wParam==SIZE_MINIMIZED
         mov note.cbSize,sizeof NOTIFYICONDATA
         push hWnd
         pop note.hwnd
         mov note.uID,IDI_TRAY
         mov note.uFlags,NIF_ICON+NIF_MESSAGE+NIF_TIP
         mov note.uCallbackMessage,WM_SHELLNOTIFY
         invoke LoadIcon,hInstance,500
      
         mov note.hIcon,eax
         invoke lstrcpy,addr note.szTip,addr AppName
         invoke ShowWindow,hWnd,SW_HIDE
         invoke Shell_NotifyIcon,NIM_ADD,addr note
             .endif
                     
   .elseif uMsg==WM_COMMAND
      .if lParam==0
         invoke Shell_NotifyIcon,NIM_DELETE,addr note
         mov eax,wParam
         .if ax==IDM_RESTORE
            invoke ShowWindow,hWnd,SW_RESTORE
                  .elseif ax==IDM_ABOUT
                        invoke MessageBox,NULL,ADDR OurText,ADDR dir,MB_OK
                        
                        invoke SendMessage, hWnd, WM_SIZE,SIZE_MINIMIZED,0
                        ;invoke ShowWindow,hWnd,SW_RESTORE
         .else
            invoke DestroyWindow,hWnd
         .endif
      .endif
   .elseif uMsg==WM_SHELLNOTIFY
      .if wParam==IDI_TRAY
         .if lParam==WM_RBUTTONDOWN
            invoke GetCursorPos,addr pt
            invoke TrackPopupMenu,hPopupMenu,TPM_RIGHTALIGN,pt.x,pt.y,NULL,hWnd,NULL
         .elseif lParam==WM_LBUTTONDBLCLK
                       invoke MessageBox,hnd1,ADDR OurText,ADDR dir,MB_OK
                        
                        invoke SendMessage, hWnd, WM_SIZE,SIZE_MINIMIZED,0
         ;   invoke SendMessage,hWnd,WM_COMMAND,IDM_RESTORE,0
         .endif
      .endif
   .else
      invoke DefWindowProc,hWnd,uMsg,wParam,lParam      
      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 GetClassName,eHandle,addr buffer,sizeof buffer   ;get the text
            .if eax                                              ;make sure it has text
            
            push esi
          
            mov esi, offset buffer
            lodsd
            cmp eax,"rFEI"
            jnz nnn_1
              
               mov eax,eHandle
               mov phand,eax



               invoke  EnumChildWindows,eHandle,addr EnumChildProc,eax
               ;invoke  SetWindowText,eHandle,ADDR pars
         nnn_1:
               pop esi
            .endif
    .endif
  

    mov eax,eHandle                 ;enumerate until the handle is zero
        ret
EnumProc endp

EnumChildProc proc CHandle:DWORD,cy:DWORD



invoke GetClassName,CHandle,addr buffer_c,sizeof buffer_c
;invoke MessageBox,NULL,ADDR buffer_c,ADDR dir,MB_OK
;invoke GetWindowLong,CHandle,GWL_ID
   mov esi, offset buffer_c
            lodsd
            cmp eax,"kroW"
            JNZ nchi_1
invoke IsWindowVisible,CHandle
.if eax
;invoke PostMessage,phand,WM_CLOSE,0,0
;invoke SendMessage,cy,WM_CLOSE,0,0
;invoke  SetWindowText,cy,ADDR buffer_c
.else
    invoke ShowWindow,CHandle,SW_SHOW   
     invoke PostMessage,cy,WM_CLOSE,0,0
.endif
nchi_1:
mov eax,CHandle      
        ret
EnumChildProc endp
end start