From dfc9d5a29a971adacf949f5283011fc5051026f9 Mon Sep 17 00:00:00 2001 From: Stanislav N Mikhailov Date: Wed, 25 Feb 2026 21:44:29 +0300 Subject: [PATCH] Add minimize-to-system-tray behavior --- include/template.inc | 30 +++++++++++------------------- src/Puer.asm | 27 +++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 19 deletions(-) diff --git a/include/template.inc b/include/template.inc index d1c4a8a..1e9992b 100644 --- a/include/template.inc +++ b/include/template.inc @@ -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 \ No newline at end of file +IDI_ICON equ 1020 diff --git a/src/Puer.asm b/src/Puer.asm index f4802fd..aae76de 100644 --- a/src/Puer.asm +++ b/src/Puer.asm @@ -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