· Начало · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› ballon в трее

Посл.отвђт Сообщенiе


Дата: Авг 2, 2004 17:16:17

Мужики. Если кому-нибудь нужно показать в трее подсказку в виде пузыря, ловите подсказку.

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