Мужики. Если кому-нибудь нужно показать в трее подсказку в виде пузыря, ловите подсказку.
1) в файле windows.inc измените объявление структуры NOTIFYICONDATAA (она же NOTIFYICONDATA) следующим образом:
NOTIFYICONDATAA STRUCT
cbSize DWORD ?
hwnd DWORD ?
uID DWORD ?
uFlags DWORD ?
uCallbackMessage DWORD ?
hIcon DWORD ?
szTip BYTE 128 dup(?)
dwState DWORD ?
dwStateMask DWORD ?
szInfo BYTE 256 dup(?)
union
uTimeout DWORD ?
uVersion DWORD ?
ends
szInfoTitle BYTE 64 dup(?)
dwInfoFlags DWORD ?
NOTIFYICONDATAA ENDS
2) В том же файле измените объявление констант:
NIIF_NONE equ 0h
NIIF_INFO equ 1h
NIIF_WARNING equ 2h
NIIF_ERROR equ 3h
3) А это пример программы:
.386
.model flat, stdcall
option casemap :none
include \MASM32\INCLUDE\WINDOWS.INC
include \MASM32\INCLUDE\KERNEL32.INC
include \MASM32\INCLUDE\USER32.INC
include \MASM32\INCLUDE\SHELL32.INC
include \MASM32\INCLUDE\GDI32.INC
includelib \MASM32\LIB\KERNEL32.LIB
includelib \MASM32\LIB\USER32.LIB
includelib \MASM32\LIB\SHELL32.LIB
includelib \MASM32\LIB\GDI32.LIB
WinMain proto :DWORD, :DWORD, :DWORD, :DWORD
WM_SHELLNOTIFY equ WM_USER+10005
IDI_TRAY equ 0
IDM_FIRST equ 1001
IDM_EXIT equ 1002
.data
ClassName db "SimpleWinClass", 0
AppName db "TrayBallon App", 0
MyString db "Вышел заяц погулять",0
ExitString db "&Закрыть программу",0
HelloString db "Hello World",0
.data?
hInstance HINSTANCE ?
CommandLine LPSTR ?
note NOTIFYICONDATA <>
hPopupMenu dd ?
; ###################################################################### ###
.code
start:
invoke GetModuleHandle, NULL
mov hInstance, eax
invoke GetCommandLine
mov CommandLine, eax
invoke WinMain, hInstance, NULL, CommandLine, 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
mov wc.lpfnWndProc, OFFSET WndProc
mov wc.cbClsExtra, NULL
mov wc.cbWndExtra, NULL
push hInstance
pop wc.hInstance
mov wc.hbrBackground, COLOR_WINDOW + 1
mov wc.lpszMenuName, NULL
mov wc.lpszClassName, OFFSET ClassName
invoke LoadIcon, 0, 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, NULL, addr ClassName, addr AppName, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,\
CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInst, NULL
mov hwnd, eax
invoke ShowWindow, hwnd, CmdShow
invoke UpdateWindow, hwnd
mov note.cbSize,sizeof NOTIFYICONDATA
push hwnd
pop note.hwnd
mov note.uID,IDI_TRAY
mov note.uFlags,NIF_MESSAGE+NIF_ICON+NIF_TIP+NIF_INFO
mov note.uCallbackMessage,WM_SHELLNOTIFY
invoke LoadIcon,0,IDI_APPLICATION
mov note.hIcon,eax
invoke lstrcpy,addr note.szTip,addr AppName
mov note.uTimeout,1000
mov note.uVersion,NOTIFYICON_VERSION
mov note.dwInfoFlags,NIIF_WARNING
invoke Shell_NotifyIcon,NIM_ADD,addr note
.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, rt:RECT
.IF uMsg == WM_DESTROY
invoke Shell_NotifyIcon,NIM_DELETE,addr note
invoke PostQuitMessage, NULL
.ELSEIF uMsg == WM_CREATE
invoke CreatePopupMenu
mov hPopupMenu,eax
invoke AppendMenu,hPopupMenu,MF_STRING,IDM_FIRST,addr MyString
invoke AppendMenu,hPopupMenu,MF_SEPARATOR,NULL,NULL
invoke AppendMenu,hPopupMenu,MF_STRING,IDM_EXIT,addr ExitString
.ELSEIF uMsg == WM_SHELLNOTIFY
.IF wParam==IDI_TRAY
.IF lParam == WM_RBUTTONDOWN
invoke GetCursorPos,addr pt
invoke SetForegroundWindow,COLOR_WINDOWFRAME+1
invoke TrackPopupMenuEx,hPopupMenu,TPM_LEFTALIGN or TPM_VERNEGANIMATION or TPM_RECURSE,pt.x,pt.y,hWnd,NULL
invoke PostMessage,hWnd,WM_NULL,0,0
.ELSEIF lParam == WM_LBUTTONDOWN
invoke lstrcpy,addr note.szInfoTitle,addr AppName
invoke lstrcpy,addr note.szInfo,addr HelloString
invoke Shell_NotifyIcon,NIM_MODIFY,addr note
.ENDIF
.ENDIF
.ELSEIF uMsg == WM_COMMAND
.IF lParam == 0
mov eax,wParam
.IF ax == IDM_EXIT
invoke Shell_NotifyIcon,NIM_DELETE,addr note
invoke DestroyWindow,hWnd
.ENDIF
.ENDIF
.ELSE
invoke DefWindowProc, hWnd, uMsg, wParam, lParam
ret
.ENDIF
xor eax, eax
ret
WndProc endp
end start