;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;程序名称:WindowAdminister NO 0.1
;适用系统:Win 9x/Me/NT/XP
;作    者:zhanshen[DFCG][RCT]
;代码日期:2006-04-05
;程序功能:窗口管理工具
;注意事项:如欲转载,请保持本程序的版本及其他信息。
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

附件下载:window.rar

.386
.Model FlatStdCall
Option Casemap :None

;-----------------------------------------------
;包含引用
Include windows.inc
Include user32.inc
Include kernel32.inc
Include Shell32.inc
Include Gdi32.inc

IncludeLib user32.lib
IncludeLib kernel32.lib
Includelib Shell32.lib
Includelib Gdi32.lib


;-----------------------------------------------
;自定义函数声明
DlgProc proto :DWORD,:DWORD,:DWORD,:DWORD
AboutDlgProc proto :DWORD,:DWORD,:DWORD,:DWORD
UrlLinkProc proto :DWORD,:DWORD,:DWORD,:DWORD
_Wsprintf proto :DWORD,:DWORD,:DWORD

;-----------------------------------------------
;常数段
.const
  DLG_MAIN              EQU  100
  DLG_ABOUT_ME          EQU  101
  DLG_WINDOW_NAME_EDIT      EQU  1000
  DLG_MY_WINDOW_TOP        EQU  1001
  DLG_REJIGGER_TITLE      EQU  1002
  ABOUT_OK              EQU  1003
  DLG_WINDOW_EDIT_HWND      EQU  1004
  DLG_WINDOW_EDIT_ID      EQU  1005
  DLG_WINDOW_EDIT_SYTLE    EQU  1006
  DLG_WINDOW_EDIT_HINSTANCE  EQU  1007
  DLG_EDIT_WNDFUNCTION      EQU  1008
  DLG_WINDOW_EDIT_CLASS    EQU  1010
  DLG_WINDOW_NOTOP        EQU  1011
  DLG_WINDOW_TOP          EQU  1012
  DLG_WINDOW_MAXIMIZE      EQU  1013
  DLG_WINDOW_MINIMIZE      EQU  1014
  DLG_WINDOW_ENABLE        EQU  1015
  DLG_WINDOW_DISABLES      EQU  1016
  DLG_WINDOW_HIDE        EQU  1017
  DLG_WINDOW_SHOW        EQU  1018
  DLG_WINDOW_CLICK        EQU  1019
  DLG_WINDOW_CLOSE        EQU  1020
  DLG_WINDOW_NOTUSESHIFT    EQU  1021
  DLG_MY_WINDOW_EXIT      EQU  1022
  DLG_MY_WINDOW_ABOUT      EQU  1023
  ABOUT_LINK_WWW_PEDIY      EQU  1024
  ABOUT_LINK_BBS_PEDIY      EQU  1025
  ABOUT_LINK_DFCG        EQU  1026
  ABOUT_LINK_RCT          EQU  1027
  ABOUT_LINK_CHINADFORCE    EQU  1028
  DLG_TIMER_ID          EQU  1
  DLG_TIMER_ELAPSE        EQU  100
  DLG_CUR              EQU  2000
  DLG_ICON              EQU  100

;-----------------------------------------------
;已初始化变量段
.data
  szTop          db  'WindowTop',0
  szNoTop        db  'WindowNoTop',0
  szUseShift      db  'UseShift',0
  szNotUseShift    db  'NotUseShift',0
  fShiftFlag      db  FALSE
  szFormat        db  '%X',0
  szLinkWwwPediy    db  'http://www.pediy.com',0
  szLinkBbsPediy    db  'http://bbs.pediy.com',0
  szLinkDfcg      db  'http://www.chinadfcg.com/woyao/index.php',0
  szLinkRct      db  'http://debugman.wintoolspro.com/index.php',0
  szLinkChinadforce  db  'http://www.chinadforce,com',0

;-----------------------------------------------
;未初始化变量段
.data?
  hInstance  HINSTANCE  ?
  hWinWindow  HWND      ?
  hLinkCur    HWND      ?

;-----------------------------------------------
;代码段
.CODE
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
START:
  invoke GetModuleHandle,NULL
  mov hInstance,eax
  invoke DialogBoxParam,hInstance,DLG_MAIN,0,offset DlgProc,0
  invoke ExitProcess,0

_Wsprintf proc szBuff,iBuffSize,Num
  invoke RtlZeroMemory,szBuff,iBuffSize
  invoke wsprintf,szBuff,addr szFormat,Num
  ret
_Wsprintf endp
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;自定义函数执行区
;主程序函数回调函数
DlgProc proc hWnd,uMsg,wParam,lParam
LOCAL @szWinBuff1[255],@szWinBuff2[255],@szWinBuff3[255]:Byte
LOCAL @point:POINT
.if uMsg==WM_INITDIALOG  ;窗口初始化消息
  invoke LoadIcon,hInstance,DLG_ICON
  invoke SendMessage,hWnd,WM_SETICON,ICON_SMALL,eax
  invoke LoadCursor,hInstance,DLG_CUR
  mov hLinkCur,eax
  invoke SendDlgItemMessage,hWnd,DLG_MY_WINDOW_TOP,BM_CLICK,NULL,NULL
  invoke SetTimer,hWnd,DLG_TIMER_ID,DLG_TIMER_ELAPSE,NULL
.elseif uMsg==WM_COMMAND  ;按钮点击消息
  mov eax,wParam
  .if ax==DLG_MY_WINDOW_EXIT  ;退出程序
    invoke SendMessage,hWnd,WM_CLOSE,NULL,NULL
  .elseif ax==DLG_MY_WINDOW_TOP  ;程序置顶或取消置顶
    invoke IsDlgButtonChecked,hWnd,DLG_MY_WINDOW_TOP
    .if eax==BST_CHECKED
      invoke SetDlgItemText,hWnd,DLG_MY_WINDOW_TOP,offset szTop
      invoke SetWindowPos,hWnd,HWND_TOPMOST,NULL,NULL,NULL,NULL,SWP_NOSIZE OR SWP_NOMOVE
    .elseif eax==BST_UNCHECKED
      invoke SetDlgItemText,hWnd,DLG_MY_WINDOW_TOP,offset szNoTop
      invoke SetWindowPos,hWnd,HWND_NOTOPMOST,NULL,NULL,NULL,NULL,SWP_NOSIZE OR SWP_NOMOVE
    .endif
  .elseif ax==DLG_REJIGGER_TITLE  ;更改程序的窗口标题
    invoke GetDlgItemText,hWnd,DLG_WINDOW_NAME_EDIT,addr @szWinBuff1,sizeof @szWinBuff1
    .if ((hWinWindow!=NULL)&&(eax!=0))
      invoke SetWindowText,hWinWindow,addr @szWinBuff1
    .endif
  .elseif ax==DLG_WINDOW_NOTOP  ;置顶获取窗口程序
    .if hWinWindow!=NULL
      invoke SetWindowPos,hWinWindow,HWND_NOTOPMOST,NULL,NULL,NULL,NULL,SWP_NOSIZE OR SWP_NOMOVE
    .endif
  .elseif ax==DLG_WINDOW_TOP  ;取消置顶获取窗口程序
    .if hWinWindow!=NULL
      invoke SetWindowPos,hWinWindow,HWND_TOPMOST,NULL,NULL,NULL,NULL,SWP_NOSIZE OR SWP_NOMOVE
    .endif
  .elseif ax==DLG_WINDOW_MAXIMIZE  ;获取窗口最大化
    .if hWinWindow!=NULL
      invoke ShowWindow,hWinWindow,SW_MAXIMIZE
    .endif
  .elseif ax==DLG_WINDOW_MINIMIZE  ;获取窗口最小化
    .if hWinWindow!=NULL
      invoke ShowWindow,hWinWindow,SW_MINIMIZE
    .endif
  .elseif ax==DLG_WINDOW_ENABLE  ;激活获取的窗口
    .if hWinWindow!=NULL
      invoke EnableWindow,hWinWindow,TRUE
    .endif
  .elseif ax==DLG_WINDOW_DISABLES  ;禁止获取的窗口
    .if hWinWindow!=NULL
      invoke EnableWindow,hWinWindow,FALSE
    .endif
  .elseif ax==DLG_WINDOW_HIDE  ;隐藏获取的窗口
    .if hWinWindow!=NULL
      invoke ShowWindow,hWinWindow,SW_HIDE
    .endif
  .elseif ax==DLG_WINDOW_SHOW  ;显示获取的窗口
    .if hWinWindow!=NULL
      invoke ShowWindow,hWinWindow,SW_SHOW
    .endif
  .elseif ax==DLG_WINDOW_CLICK  ;点击获取的窗口
    .if hWinWindow!=NULL
      invoke SendMessage,hWinWindow,BM_CLICK,NULL,NULL
    .endif
  .elseif ax==DLG_WINDOW_CLOSE  ;关闭获取的窗口
    .if hWinWindow!=NULL
      invoke SendMessage,hWinWindow,WM_SYSCOMMAND,SC_CLOSE,NULL
    .endif
  .elseif ax==DLG_WINDOW_NOTUSESHIFT  ;是否使用Shift键来获取窗口信息
    invoke IsDlgButtonChecked,hWnd,DLG_WINDOW_NOTUSESHIFT
    .if eax==BST_CHECKED
      invoke SetDlgItemText,hWnd,DLG_WINDOW_NOTUSESHIFT,offset szNotUseShift
      mov fShiftFlag,TRUE
    .elseif eax==BST_UNCHECKED
      invoke SetDlgItemText,hWnd,DLG_WINDOW_NOTUSESHIFT,offset szUseShift
      mov fShiftFlag,FALSE
    .endif
  .elseif ax==DLG_MY_WINDOW_ABOUT
    invoke DialogBoxParam,hInstance,DLG_ABOUT_ME,hWnd,offset AboutDlgProc,NULL
  .endif
.elseif uMsg==WM_TIMER  ;计时器消息
  .if fShiftFlag
    jmp @f
  .endif
  invoke GetKeyState,VK_SHIFT
  test eax,80000000
  .if !ZERO?
@@:
    invoke GetCursorPos,addr @point
    invoke WindowFromPoint,@point.x,@point.y  ;取得当前鼠标窗口句柄
    mov hWinWindow,eax
    invoke _Wsprintf,addr @szWinBuff3,sizeof @szWinBuff3,hWinWindow
    invoke SetDlgItemText,hWnd,DLG_WINDOW_EDIT_HWND,addr @szWinBuff3
    invoke GetClassName,hWinWindow,addr @szWinBuff3,sizeof @szWinBuff3 ;获取窗口句柄
    invoke SetDlgItemText,hWnd,DLG_WINDOW_EDIT_CLASS,addr @szWinBuff3
    invoke GetWindowLong,hWinWindow,GWL_STYLE  ;获取窗口风格
    invoke _Wsprintf,addr @szWinBuff3,sizeof @szWinBuff3,eax
    invoke SetDlgItemText,hWnd,DLG_WINDOW_EDIT_SYTLE,addr @szWinBuff3
    invoke GetWindowLong,hWinWindow,GWL_ID  ;获取窗口ID
    invoke _Wsprintf,addr @szWinBuff3,sizeof @szWinBuff3,eax
    invoke SetDlgItemText,hWnd,DLG_WINDOW_EDIT_ID,addr @szWinBuff3
    invoke GetWindowLong,hWinWindow,GWL_HINSTANCE  ;获取窗口模块
    invoke _Wsprintf,addr @szWinBuff3,sizeof @szWinBuff3,eax
    invoke SetDlgItemText,hWnd,DLG_WINDOW_EDIT_HINSTANCE,addr @szWinBuff3
    invoke GetWindowLong,hWinWindow,GWL_WNDPROC  ;获取窗口回调函数
    invoke _Wsprintf,addr @szWinBuff3,sizeof @szWinBuff3,eax
    invoke SetDlgItemText,hWnd,DLG_EDIT_WNDFUNCTION,addr @szWinBuff3
    invoke GetWindowText,hWinWindow,addr @szWinBuff2,sizeof @szWinBuff2
    invoke SetDlgItemText,hWnd,DLG_WINDOW_NAME_EDIT,addr @szWinBuff2
  .endif
.elseif uMsg==WM_CLOSE   ;关闭程序
  invoke KillTimer,hWnd,DLG_TIMER_ID
  invoke EndDialog,hWnd,FALSE
.else
  mov eax,FALSE
  ret
.endif
mov eax,TRUE
ret
DlgProc endp

;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;关于对话框回调函数
AboutDlgProc proc uses edi esi hWnd,uMsg,wParam,lParam
LOCAL @hFontOut:DWORD
LOCAL @st_hFont:LOGFONT
  .if uMsg==WM_INITDIALOG
    invoke LoadIcon,hInstance,100
    invoke SendMessage,hWnd,WM_SETICON,ICON_SMALL,eax
    mov edi,1024
    .while edi <= 1028   ;子类化超级链接
      invoke GetDlgItem,hWnd,edi
      mov esi,eax
      invoke SetWindowLong,esi,GWL_WNDPROC,offset UrlLinkProc
      invoke SetWindowLong,esi,GWL_USERDATA,eax
      inc edi
    .endw
  .elseif uMsg==WM_CTLCOLORSTATIC  ;重画超级链接文字颜色及背景颜色
    invoke GetDlgCtrlID,lParam
    .if (eax>=1024) && (eax<=1028)
      invoke SendMessage,lParam,WM_GETFONT,NULL,NULL
      mov @hFontOut,eax
      invoke GetObject,@hFontOut,sizeof LOGFONT,addr @st_hFont
      mov @st_hFont.lfUnderline,NULL
      invoke CreateFontIndirect,addr @st_hFont
      mov @hFontOut,eax
      invoke SelectObject,wParam,eax
      invoke SetTextColor,wParam,0FF0000h
      invoke GetSysColor,15
      invoke SetBkColor,wParam,eax
      invoke DeleteObject,@hFontOut
      invoke GetStockObject,5
    .else
      xor eax,eax
      ret
    .endif
    ret
  .elseif uMsg==WM_COMMAND
    mov eax,wParam
    .if ax==ABOUT_OK
      invoke EndDialog,hWnd,FALSE
    .endif
  .elseif uMsg==WM_CLOSE
    invoke EndDialog,hWnd,FALSE
  .else
    xor eax,eax
    ret
  .endif
  mov eax,TRUE
  ret
AboutDlgProc endp

;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;Label控件回调函数子类化函数
UrlLinkProc proc hWnd,uMsg,wParam,lParam
  .if uMsg==WM_LBUTTONUP
    invoke GetDlgCtrlID,hWnd
    .if eax==ABOUT_LINK_WWW_PEDIY
      mov eax,offset szLinkWwwPediy
    .elseif eax==ABOUT_LINK_BBS_PEDIY
      mov eax,offset szLinkBbsPediy
    .elseif eax==ABOUT_LINK_DFCG
      mov eax,offset szLinkDfcg
    .elseif eax==ABOUT_LINK_RCT
      mov eax,offset szLinkRct
    .elseif eax==ABOUT_LINK_CHINADFORCE
      mov eax,offset szLinkChinadforce
    .endif
    invoke ShellExecute,NULL,NULL,eax,NULL,NULL,SW_SHOW
  .elseif uMsg==WM_NCHITTEST
    mov eax,TRUE
    ret
  .elseif uMsg==WM_SETCURSOR
    invoke SetCursor,hLinkCur
  .else
    invoke GetWindowLong,hWnd,GWL_USERDATA
    invoke CallWindowProc,eax,hWnd,uMsg,wParam,lParam
    ret
  .endif
  xor eax,eax
  ret
UrlLinkProc endp

END START