Add minimize-to-system-tray behavior

This commit is contained in:
Stanislav N Mikhailov
2026-02-25 21:44:29 +03:00
parent 889fc5fcbe
commit dfc9d5a29a
2 changed files with 38 additions and 19 deletions
+11 -19
View File
@@ -1,6 +1,8 @@
include /masm64/include64/masm64rt.inc
include /masm64/include64/user32.inc
include /masm64/include64/shell32.inc
includelib /masm64/lib64/user32.lib
includelib /masm64/lib64/shell32.lib
;______________________Прототипы__________________________
WinMain proto :HINSTANCE,:HINSTANCE,:LPSTR,:QWORD
@@ -14,27 +16,17 @@ hInstance HINSTANCE ? ; Хэндл нашей пpогpаммы
CommandLine LPSTR ?
hIcon dq ? ; icon handle
NOTIFYICONDATAW STRUCT
TRAYICONDATAA STRUCT
cbSize DWORD ?
hwnd QWORD ?
_pad0 DWORD ?
hWnd QWORD ?
uID DWORD ?
uFlags DWORD ?
uCallbackMessage DWORD ?
_pad1 DWORD ?
hIcon QWORD ?
szTip WORD 64 dup (?)
WORD 64 dup (?)
dwState DWORD ?
dwStateMask DWORD ?
szInfo WORD 256 dup(?)
union DUMMYUNIONNAME
uTimeout DWORD ?
uVersion DWORD ?
ends
szInfoTitle WORD 64 dup(?)
dwInfoFlags DWORD ?
guidItem GUID <>
hBalloonIcon QWORD ?
NOTIFYICONDATAW ENDS
szTip BYTE 128 dup(?)
TRAYICONDATAA ENDS
BITMAPINFOHEADER STRUCT
biSize DWORD ?;
@@ -72,10 +64,10 @@ bmi BITMAPINFO <>
rc RECT <>
RestoreString db "&Restore",0
ExitString db "E&xit Program",0
note NOTIFYICONDATAW <>
IDI_TRAY equ 0
note TRAYICONDATAA <>
IDI_TRAY equ 1
IDM_RESTORE equ 1000
IDM_EXIT equ 1010
IDI_ICON equ 1020
IDI_ICON equ 1020
+27
View File
@@ -39,6 +39,7 @@ WinMain endp
WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
LOCAL hDC:HDC
.if uMsg==WM_DESTROY ; если пользователь закpывает окно
invoke Shell_NotifyIconA,NIM_DELETE,addr note
invoke DestroyMenu,hPopupMenu
invoke SetThreadExecutionState,ES_CONTINUOUS
invoke PostQuitMessage,NULL ; выходим из пpогpаммы
@@ -47,6 +48,13 @@ WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
mov hPopupMenu,rax ;Создаём pop-up меню для взаимодействия через трей
invoke AppendMenuA,hPopupMenu,MF_STRING,IDM_RESTORE,addr RestoreString
invoke AppendMenuA,hPopupMenu,MF_STRING,IDM_EXIT,addr ExitString
invoke LoadIcon,hInstance,IDI_ICON
mov hIcon,rax
.if rax==0
invoke LoadIcon,NULL,IDI_APPLICATION
mov hIcon,rax
.endif
mov note.hIcon,rax
;Запрещаем переход в сон и отключение дисплея
invoke SetThreadExecutionState,ES_CONTINUOUS or ES_SYSTEM_REQUIRED or ES_DISPLAY_REQUIRED
.if rax ==-1
@@ -56,6 +64,25 @@ WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
ret
.endif
.elseif uMsg==WM_SIZE
.if wParam==SIZE_MINIMIZED
mov note.cbSize,SIZEOF TRAYICONDATAA
mov rax,hWnd
mov note.hWnd,rax
mov note.uID,IDI_TRAY
mov note.uFlags,NIF_ICON or NIF_MESSAGE or NIF_TIP
mov note.uCallbackMessage,WM_SHELLNOTIFY
mov rax,hIcon
mov note.hIcon,rax
invoke lstrcpyA,addr note.szTip,addr AppName
invoke Shell_NotifyIconA,NIM_ADD,addr note
.if rax==0
.else
invoke ShowWindow,hWnd,SW_HIDE
.endif
.endif
mov rax,0
ret
.elseif uMsg==WM_PAINT
invoke myPaint,hWnd
.elseif uMsg==WM_ERASEBKGND