ITEEDU

Win32ASM经验点滴#1

Q1. 如何隐藏/显示任务栏?
Q2. 如何禁止/允许/显示/隐藏开始按钮?
Q3. 如何创建一个真正的"总在最上面"窗口?
Q4. 如何创建热键?比如CTRL + ALT + A
Q5. 如何获得Windows目录和系统目录?
Q6. 如何从我的程序打开开始菜单?
Q7. 如何关闭被正激活的程序?
Q8. 如何去掉窗口标题?
Q9. 如何知道窗口是否在任务栏中(或可见) ?
Q10. 如何隐藏一个窗口?
Q11. 如何将窗口置于前台?
Q12. 如何屏蔽CTRL+ALT+DEL,ALT+TAB+CTRL+ESC这些键?
Q13. 如何确定Windows任务栏的自动隐藏特性是否被激活?
Q14. 如何使用默认的浏览器或邮件程序?
Q15. 如何用Win32 API显示网络连接对话框?

- 如何隐藏/显示任务栏?

       SHELL  DB        "SHELL_TRAYWND",0       ; 任务栏的类名
              INVOKE    FINDWINDOW,ADDR SHELL,NULL          ; 先获得句柄,之后隐藏.
.IF           EAX != 0
              INVOKE    SHOWWINDOW,EAX,SW_HIDE  ; 用SW_SHOW显示
.ENDIF

- 如何禁止/允许/显示/隐藏开始按钮?

.DATA?
      BUFFER  DB        127 DUP(?)

.DATA
       SHELL  DB        "SHELL_TRAYWND",0
        SBAR  DB        "BUTTON",0
       CHILD  DD        ?
        SLEN  DD        ?

.CODE
              INVOKE    FINDWINDOW,ADDR SHELL,NULL          ; 获得状态栏句柄
              MOV       TRAY, EAX
              INVOKE    GETWINDOW,TRAY, GW_CHILD            ; 获得状态栏的子窗口(如果有的话)
              MOV       CHILD, EAX
.IF           CHILD != 0
              INVOKE    GETCLASSNAME,CHILD,OFFSET BUFFER, SIZEOF BUFFER ;获得子窗口类名
.IF           EAX > 0
              INVOKE    LSTRLEN, OFFSET BUFFER  ;获得类名长度
              MOV       SLEN,EAX
              INVOKE    CHARUPPERBUFF,OFFSET BUFFER,SLEN    ;转为大写
              INVOKE    LSTRCMP,ADDR BUFFER, ADDR SBAR      ;将类名与'BUTTON'比较
.IF           EAX == 0
              INVOKE    SHOWWINDOW,CHILD,SW_HIDE            ; 隐藏开始按钮
; invoke ShowWindow,child,SW_SHOW ; 显示开始按钮
; invoke EnableWindow,child,FALSE ; 禁止开始按钮
; invoke EnableWindow,child,TRUE ; 允许开始按钮
.ENDIF
.ENDIF
.ENDIF

- 如何创建一个真正的"总在最上面"窗口?

              INVOKE    SETWINDOWPOS,HWIN, HWND_TOPMOST,NULL,NULL,NULL,NULL,SWP_NOACTIVATE OR SWP_NOMOVE OR SWP_NOSIZE

- 如何创建热键?比如CTRL + ALT + A

.DATA
        HMSG  DB        "HOTKEY CTRL + ALT + A WORKS GOOD!",0
        HCAP  DB        "HOTKEY EXAMPLE",0

.CODE
.IF           UMSG == WM_CREATE
              INVOKE    REGISTERHOTKEY,HWND,065H,MOD_CONTROL OR MOD_ALT, 041H       ; CTRL + ALT + A (041h is 65 - 065h is 101)

.ELSEIF       UMSG == WM_HOTKEY
              INVOKE    MESSAGEBOX,HWIN,ADDR HMSG,ADDR HCAP, MB_OK OR MB_ICONINFORMATION

.ELSEIF       UMSG == WM_DESTROY
              INVOKE    UNREGISTERHOTKEY,HWIN,065H
              INVOKE    POSTQUITMESSAGE,NULL
return 0 
.ENDIF

-如何获得Windows目录和系统目录

.DATA
      BUFFER  DB        50 DUP(?)
        HCAP  DB        "WINDOWSDIRECTORY",0

.CODE
              INVOKE    GETWINDOWSDIRECTORY, ADDR BUFFER, SIZEOF BUFFER ; 置Windows目录于缓冲区中
; invoke GetSystemDirectory, addr buffer, sizeof buffer ;置系统目录于缓冲区中
              INVOKE    MESSAGEBOX,HWND, ADDR BUFFER, ADDR HCAP, MB_OK OR MB_ICONINFORMATION

- 如何从我的程序打开开始菜单?

              INVOKE    SENDMESSAGE,HWND,WM_SYSCOMMAND,SC_TASKLIST,NULL

- 如何关闭正被激活的程序 ?

.DATA
        FWIN  DD        ?

.CODE
              INVOKE    GETFOREGROUNDWINDOW
              MOV       FWIN,EAX
              INVOKE    SENDMESSAGE, FWIN, WM_CLOSE,NULL

- 如何去掉窗口标题 ?

              INVOKE    GETWINDOWLONG,HWND,GWL_STYLE        ; 获得当前窗口类
              AND       EAX,NOT WS_CAPTION      ; 去掉WS_CAPTION
              INVOKE    SETWINDOWLONG,HWND,GWL_STYLE,EAX    ; 设置窗口类

- 如何知道窗口是否在任务栏中(或可见)?

              INVOKE    ISWINDOWVISIBLE,HWIN
.IF           EAX == TRUE
; 窗口可见
.ELSE
; 窗口不可见
.ENDIF

- 如何隐藏一个窗口?

.DATA
        MIRC  DB        "MIRC32",0
       MHAND  DD        ?

.CODE
              INVOKE    FINDWINDOW,ADDR MIRC, NULL          ; 寻找mIRC32
              MOV       MHAND,EAX
.IF           MHAND != 0                   ; 找到?
              INVOKE    SHOWWINDOW,MHAND,SW_SHOW            ; 显示窗口
; invoke ShowWindow,mhand,SW_HIDE ; 隐藏窗口
.ELSE
; mIRC32未运行...
.ENDIF

- 如何将窗口置于前台?

              INVOKE    SETFOREGROUNDWINDOW, MHAND

- 如何屏蔽CTRL+ALT+DEL,ALT+TAB+CTRL+ESC这些键?

              INVOKE    SYSTEMPARAMETERSINFO,SPI_SCREENSAVERRUNNING,1,NULL,NULL
; Windows98 only 1 关闭 0 允许 

- 如何确定Windows任务栏的自动隐藏特性是否被激活?

.DATA
AppBar APPBARDATA {} ; {} 指使用默认值... Thanks to TTom

.CODE
              MOV       APPBAR.CBSIZE, SIZEOF APPBAR
              INVOKE    SHAPPBARMESSAGE, ABM_GETSTATE, ADDR APPBAR      ; ShellApi命令
              AND       EAX, ABS_AUTOHIDE
.IF           EAX == TRUE
; 任务栏被隐藏
.ELSE
; 任务栏未被隐藏
.ENDIF

- 如何使用默认的浏览器或邮件程序?

.DATA
      LPPAGE  DB        "HTTP://WIN32ASM.CJB.NET",0
      LPMAIL  DB        "ATES@ANET.NET.TR",0
 LPOPERATION  DB        "OPEN",0

.CODE
              INVOKE    SHELLEXECUTE,HWIN,ADDR LPOPERATION, ADDR LPPAGE, NULL, NULL, SW_SHOWNORMAL
              INVOKE    SHELLEXECUTE,HWIN,ADDR LPOPERATION, ADDR LPMAIL, NULL, NULL, SW_SHOWNORMAL

- 如何用Win32 API显示网络连接对话框?

     INCLUDE  \MASM32\INCLUDE\MPR.INC
  INCLUDELIB  \MASM32\LIB\MPR.LIB
              INVOKE    WNETCONNECTIONDIALOG,HWND,RESOURCETYPE_DISK