;運行效果
;win32匯編環境,對話框程序中創建托盤示例一
;托盤,就是電腦桌面右下角那個角落里的圖標,這里展示基本的應用方法。
;直接抄進RadAsm可編譯運行。重要部分加備注。
;下面為asm文件
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.386?
.model flat,stdcall?
option casemap:none?
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定義
include ? ?windows.inc?
include ? ?user32.inc?
include ? ?kernel32.inc
include ? ?shell32.inc ? ? ;添加必需的頭文件
includelib user32.lib?
includelib kernel32.lib
includelib shell32.lib ? ? ;添加必需的庫文件?
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 自定義函數聲明
DlgProc proto :DWORD,:DWORD,:DWORD,:DWORD ? ;對話框窗口函數
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;Equ 等值定義
MAINDIALOG ? ? ?equ 1
ICO_MAIN ? ? ? ?equ 1000 ? ? ? ? ? ? ? ? ? ? ? ? ?;圖標 ?
WM_SHELLNOTIFY ?equ WM_USER + 9 ? ? ? ? ? ? ? ? ? ;自定義私人消息,用來處理托盤圖標方面的反應
IDI_TRAY ? ? ? ?equ 2
IDM_RESTORE ? ? equ 100
IDM_EXIT ? ? ? ?equ 101
; 數據段
.data?
szAppName ? ? ? db "我在這里",0 ? ? ? ? ? ? ? ? ?;當鼠標在其上面時,顯示的提示
szRestoreString db "恢復窗口",0
szExitString ? ?db "退出程序",0
.data??
hInstance ?HINSTANCE ? ??
Snote NOTIFYICONDATA ? <> ? ? ? ? ? ? ? ? ? ? ? ?;定義包含系統需要在通知區域中顯示通知的信息的結構
hPopupMenu dd ? ? ? ? ??
.const?
; 代碼段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code?
start: ? ??
? ? ? ? invoke GetModuleHandle, NULL ? ??
? ? ? ? mov ? ?hInstance,eax ? ??
? ? ? ? invoke DialogBoxParam, hInstance,MAINDIALOG,NULL, addr DlgProc, NULL ? ??
? ? ? ? invoke ExitProcess,eax?
DlgProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM ?
? ? ? ? LOCAL pt:POINT
? ? ? ?
? ? ? ? .if uMsg == WM_INITDIALOG ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ? invoke ? ?LoadIcon,hInstance,ICO_MAIN ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ? invoke ? ?SendMessage,hWnd,WM_SETICON,ICON_BIG,eax ?
? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ? invoke CreatePopupMenu ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ;創建彈出式菜單
? ? ? ? ? ? ? ? ? ? ? ? mov hPopupMenu,eax
? ? ? ? ? ? ? ? ? ? ? ? invoke AppendMenu,hPopupMenu,MF_STRING,IDM_RESTORE,addr szRestoreString ?;給創建的彈出式菜單增加項目
? ? ? ? ? ? ? ? ? ? ? ? invoke AppendMenu,hPopupMenu,MF_STRING,IDM_EXIT,addr szExitString ?
? ? ? ? .elseif uMsg == WM_SIZE ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?;WM_SIZE消息是當窗口大小或位置發生變化時捕獲的消息
? ? ? ? ? ? ? ? .if wParam == SIZE_MINIMIZED ? ? ? ? ? ? ? ? ? ? ? ? ? ? ;當窗口最小化時,則
? ? ? ? ? ? ? ? ? ? ? ? mov Snote.cbSize,sizeof NOTIFYICONDATA ? ? ? ? ? ;NOTIFYICONDATA此結構的大小
? ? ? ? ? ? ? ? ? ? ? ? push hWnd
? ? ? ? ? ? ? ? ? ? ? ? pop Snote.hwnd ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ;把相關聯的主窗口句柄給這個結構變量
? ? ? ? ? ? ? ? ? ? ? ? mov Snote.uID,IDI_TRAY ? ? ? ? ? ? ? ? ? ? ? ? ? ;任務欄圖標的應用程序定義標識符,就是其ID,這個用來區分你點了哪個不同的托盤圖標
? ? ? ? ? ? ? ? ? ? ? ? mov Snote.uFlags,NIF_ICON+NIF_MESSAGE+NIF_TIP ? ?;指出在這個NOTIFYICONDATA結構中,哪些成員有效。這里指uCallbackMessage成員,hIcon成員,szTip成員有效
? ? ? ? ? ? ? ? ? ? ? ? mov Snote.uCallbackMessage,WM_SHELLNOTIFY ? ? ? ?;告訴NOTIFYICONDATA結構,當有消息在系統圖標時,去找 WM_SHELLNOTIFY 這個私人消息處理
? ? ? ? ? ? ? ? ? ? ? ? invoke LoadIcon,hInstance,ICO_MAIN ? ? ? ? ? ? ? ;加載圖標
? ? ? ? ? ? ? ? ? ? ? ? mov Snote.hIcon,eax ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?;把圖標給這個NOTIFYICONDATA結構
? ? ? ? ? ? ? ? ? ? ? ? invoke lstrcpy,addr Snote.szTip,addr szAppName ? ;當鼠標停留在托盤圖標上面時,顯示的字符串
? ? ? ? ? ? ? ? ? ? ? ? invoke ShowWindow,hWnd,SW_HIDE ? ? ? ? ? ? ? ? ? ;把主窗口隱藏
? ? ? ? ? ? ? ? ? ? ? ? invoke Shell_NotifyIcon,NIM_ADD,addr Snote ? ? ? ;調用Shell_NotifyIcon函數,把前面塞滿內容的NOTIFYICONDATA結構當作參數給它.并告訴電腦,將圖標添加消息發送到右下角的任務欄的狀態區域
? ? ? ? ? ? ? ? .endif ?
? ? ? ? .elseif uMsg == WM_SHELLNOTIFY ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ;處理自定義消息
? ? ? ? ? ? ? ? .if wParam == IDI_TRAY ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ;如果是這個程序的托盤圖標,則
? ? ? ? ? ? ? ? ? ? ? ? .if lParam == WM_RBUTTONDOWN ? ? ? ? ? ? ? ? ? ? ;如果鼠標單擊右鍵,則
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? invoke GetCursorPos,addr pt ? ? ? ? ? ? ?;得到當前鼠標的坐標并將X值及Y值給坐標結構 pt
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? invoke SetForegroundWindow,hWnd ? ? ? ? ?;將創建指定窗口的線程引入前臺并激活窗口
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? invoke TrackPopupMenu,hPopupMenu,TPM_RIGHTALIGN,pt.x,pt.y,NULL,hWnd,NULL ? ?;在鼠標所點的位置顯示所創建的菜單,并跟蹤菜單上項的選擇
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? invoke PostMessage,hWnd,WM_NULL,0,0 ? ? ?;發送空消息給主窗口
? ? ? ? ? ? ? ? ? ? ? ? .elseif lParam == WM_LBUTTONDBLCLK ? ? ? ? ? ? ? ;如果鼠標左鍵雙擊時,則
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? invoke SendMessage,hWnd,WM_COMMAND,IDM_RESTORE,0 ? ?;發送WM_COMMAND消息,即后面的命令消息給主窗口,其wParam值是IDM_RESTORE,其lParam值是0
? ? ? ? ? ? ? ? ? ? ? ? .endif
? ? ? ? ? ? ? ? .endif ? ? ? ??
? ? ? ? .elseif uMsg == WM_COMMAND
? ? ? ? ? ? ? ? .if lParam == 0 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?;選擇菜單時
? ? ? ? ? ? ? ? ? ? ? ? invoke Shell_NotifyIcon,NIM_DELETE,addr Snote ? ?;刪除圖標
? ? ? ? ? ? ? ? ? ? ? ? mov eax,wParam
? ? ? ? ? ? ? ? ? ? ? ? .if ax == IDM_RESTORE ? ? ? ? ? ? ? ? ? ? ? ? ? ?;如果是恢復主窗口,則恢復
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? invoke ShowWindow,hWnd,SW_RESTORE
? ? ? ? ? ? ? ? ? ? ? ? .else
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? invoke DestroyWindow,hWnd
? ? ? ? ? ? ? ? ? ? ? ? .endif
? ? ? ? ? ? ? ? .endif ? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? .elseif uMsg == WM_CLOSE ??
? ? ? ? ? ? ? ? invoke DestroyMenu,hPopupMenu ? ? ? ? ? ? ? ? ? ? ? ? ? ?;退出時清除創建的菜單 ? ? ? ? ??
? ? ? ? ? ? ? ? invoke EndDialog, hWnd,NULL ? ? ? ??
? ? ? ? .else ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? mov eax,FALSE ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ret ? ? ? ? ? ? ? ??
? ? ? ? .endif ? ? ? ? ? ? ? ??
? ? ? ? mov eax,TRUE ? ? ? ??
? ? ? ? ret?
DlgProc endp?
end start?
;下面為rc文件內容
#include "resource.h" ? ? ? ? ? ? ?//提示缺少該文件,可以在資源里下載
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#define ? ?MAINDIALOG ? ? ?1
#define ? ?ICO_MAIN ? ? ? ?1000 ? ?//圖標 ?
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ICO_MAIN ? ?ICON ? ? ? ?"Main.ico"
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//定義對話框
MAINDIALOG DIALOG 10, 10, 205, 60?
STYLE ?DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX | WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK?
CAPTION "對話框程序模版"
FONT 12, "方正姚體"
BEGIN
? ? ?CONTROL "點擊最化小按鈕則會縮為右下角的托盤", -1, "Static", WS_CHILD | WS_VISIBLE, 30, 20, 200, 10
END?
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>