feat(tray): add Unicode sleep toggle menu and preserve tray tooltip on icon updates

This commit is contained in:
Stanislav N Mikhailov
2026-02-27 22:06:21 +03:00
parent 2b323192d1
commit 48d99d76a1
5 changed files with 106 additions and 41 deletions
BIN
View File
Binary file not shown.
+34 -12
View File
@@ -1,23 +1,33 @@
__UNICODE__ equ 1
include /masm64/include64/masm64rt.inc include /masm64/include64/masm64rt.inc
include /masm64/include64/user32.inc include /masm64/include64/user32.inc
include /masm64/include64/shell32.inc include /masm64/include64/shell32.inc
includelib /masm64/lib64/user32.lib includelib /masm64/lib64/user32.lib
includelib /masm64/lib64/shell32.lib includelib /masm64/lib64/shell32.lib
;______________________Прототипы__________________________ ;______________________Prototypes__________________________
WinMain proto :HINSTANCE,:HINSTANCE,:LPSTR,:QWORD WinMain proto :HINSTANCE,:HINSTANCE,:LPSTR,:QWORD
myPaint proto :HWND ;Обработка сообщения WM_PAINT myPaint proto :HWND ; WM_PAINT handler
myDraw proto nSegment:DWORD ;принимаю параметр с колличеством сегментов (в HIWORD) и номером данного сегмента (в LOWORD) myDraw proto nSegment:DWORD ; segment draw helper
WM_SHELLNOTIFY equ WM_USER+5 WM_SHELLNOTIFY equ WM_USER+5
IFNDEF NIM_SETVERSION
NIM_SETVERSION equ 4
ENDIF
IFNDEF NOTIFYICON_VERSION_4
NOTIFYICON_VERSION_4 equ 4
ENDIF
IFNDEF NIF_SHOWTIP
NIF_SHOWTIP equ 80h
ENDIF
;_______________________________________________________ ;_______________________________________________________
.data? .data?
hInstance HINSTANCE ? ; Хэндл нашей пpогpаммы hInstance HINSTANCE ? ; app instance handle
CommandLine LPSTR ? CommandLine LPSTR ?
hIcon dq ? hIcon dq ?
sleepBlockEnabled dq ? sleepBlockEnabled dq ?
TRAYICONDATAA STRUCT NOTIFYICONDATAW STRUCT
cbSize DWORD ? cbSize DWORD ?
_pad0 DWORD ? _pad0 DWORD ?
hWnd QWORD ? hWnd QWORD ?
@@ -26,8 +36,16 @@ TRAYICONDATAA STRUCT
uCallbackMessage DWORD ? uCallbackMessage DWORD ?
_pad1 DWORD ? _pad1 DWORD ?
hIcon QWORD ? hIcon QWORD ?
szTip BYTE 128 dup(?) szTip WORD 128 dup(?)
TRAYICONDATAA ENDS dwState DWORD ?
dwStateMask DWORD ?
szInfo WORD 256 dup(?)
uTimeoutOrVersion DWORD ?
szInfoTitle WORD 64 dup(?)
dwInfoFlags DWORD ?
guidItem BYTE 16 dup(?)
hBalloonIcon QWORD ?
NOTIFYICONDATAW ENDS
BITMAPINFOHEADER STRUCT BITMAPINFOHEADER STRUCT
biSize DWORD ?; biSize DWORD ?;
@@ -56,18 +74,22 @@ hPopupMenu dq ?
;_______________________________________________________ ;_______________________________________________________
.data .data
szClassName db "CocaClass",0 ; Имя нашего класса окна szClassName dw "C","o","c","a","C","l","a","s","s",0 ; window class name
AppName db "Pu'er tea: no sleeping on the job!",0 ; Имя нашего окна AppName dw 0050h,0075h,0027h,0065h,0072h,0020h,0074h,0065h,0061h,003ah,0020h,041dh,0430h,0020h,0440h,0430h,0431h,043eh,0442h,0435h,0020h,043dh,0435h,0020h,0441h,043fh,0438h,043ch,0021h,0D83Dh,0DE00h,0; window title / tray tip
ELAPSE_UPDTIMER EQU 20 ELAPSE_UPDTIMER EQU 20
IDT_UPDTIMER EQU 111 IDT_UPDTIMER EQU 111
wc WNDCLASSEX <sizeof WNDCLASSEX,CS_HREDRAW or CS_VREDRAW,WndProc,0,0,?,?,?,COLOR_WINDOW+1,NULL,szClassName,?> wc WNDCLASSEX <sizeof WNDCLASSEX,CS_HREDRAW or CS_VREDRAW,WndProc,0,0,?,?,?,COLOR_WINDOW+1,NULL,szClassName,?>
bmi BITMAPINFO <> bmi BITMAPINFO <>
rc RECT <> rc RECT <>
RestoreString db "&Restore",0 RestoreString dw "&","R","e","s","t","o","r","e",0
ExitString db "E&xit Program",0 ExitString dw 0412h,0026h,044bh,0445h,043eh,0434h,0
note TRAYICONDATAA <> EnableSleep dw 0420h,0430h,0437h,0440h,0435h,0448h,0438h,0442h,044ch,0020h,0441h,043eh,043dh,0
DisableSleep dw 0417h,0430h,043fh,0440h,0435h,0442h,0438h,0442h,044ch,0020h,0441h,043eh,043dh,0
note NOTIFYICONDATAW <>
IDI_TRAY equ 1 IDI_TRAY equ 1
IDM_RESTORE equ 1000 IDM_RESTORE equ 1000
IDM_ENABLESLEEP equ 1100
IDM_DISABLESLEEP equ 1110
IDM_EXIT equ 1010 IDM_EXIT equ 1010
+1 -1
View File
@@ -27,7 +27,7 @@ BEGIN
VALUE "OriginalFilename", "Puer.exe\000" VALUE "OriginalFilename", "Puer.exe\000"
VALUE "LegalCopyright", "\251 2025 Friends of Svetopaper\000" VALUE "LegalCopyright", "\251 2025 Friends of Svetopaper\000"
VALUE "ProductName", "Pu'er tea\000" VALUE "ProductName", "Pu'er tea\000"
VALUE "ProductVersion", "1.0\000" VALUE "ProductVersion", "1.2\000"
END END
END END
BIN
View File
Binary file not shown.
+63 -20
View File
@@ -19,8 +19,8 @@ WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:QWORD
mov wc.hIconSm,rax mov wc.hIconSm,rax
invoke LoadCursor,NULL,IDC_ARROW invoke LoadCursor,NULL,IDC_ARROW
mov wc.hCursor,rax mov wc.hCursor,rax
invoke RegisterClassEx, addr wc invoke RegisterClassExW, addr wc
invoke CreateWindowEx,NULL,ADDR szClassName,ADDR AppName,WS_OVERLAPPEDWINDOW,282,0,1354,1017,NULL,NULL,hInst,NULL invoke CreateWindowExW,NULL,ADDR szClassName,ADDR AppName,WS_OVERLAPPEDWINDOW,282,0,1354,1017,NULL,NULL,hInst,NULL
mov hwnd,rax mov hwnd,rax
invoke ShowWindow,hwnd,SW_HIDE invoke ShowWindow,hwnd,SW_HIDE
@@ -38,9 +38,11 @@ WinMain endp
WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
LOCAL hDC:HDC LOCAL hDC:HDC
LOCAL pt:POINT LOCAL pt:POINT
LOCAL trayMsg:DWORD
LOCAL trayId:DWORD
.if uMsg==WM_DESTROY .if uMsg==WM_DESTROY
invoke Shell_NotifyIconA,NIM_DELETE,addr note invoke Shell_NotifyIconW,NIM_DELETE,addr note
invoke DestroyMenu,hPopupMenu invoke DestroyMenu,hPopupMenu
invoke SetThreadExecutionState,ES_CONTINUOUS invoke SetThreadExecutionState,ES_CONTINUOUS
invoke PostQuitMessage,NULL invoke PostQuitMessage,NULL
@@ -48,7 +50,10 @@ WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
.elseif uMsg==WM_CREATE .elseif uMsg==WM_CREATE
invoke CreatePopupMenu invoke CreatePopupMenu
mov hPopupMenu,rax mov hPopupMenu,rax
invoke AppendMenuA,hPopupMenu,MF_STRING,IDM_EXIT,addr ExitString invoke AppendMenuW,hPopupMenu,MF_STRING,IDM_DISABLESLEEP,addr DisableSleep
invoke AppendMenuW,hPopupMenu,MF_STRING,IDM_ENABLESLEEP,addr EnableSleep
invoke AppendMenuW,hPopupMenu,MF_SEPARATOR,0,NULL
invoke AppendMenuW,hPopupMenu,MF_STRING,IDM_EXIT,addr ExitString
invoke LoadIcon,hInstance,IDI_ICON invoke LoadIcon,hInstance,IDI_ICON
mov hIcon,rax mov hIcon,rax
@@ -57,16 +62,18 @@ WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
mov hIcon,rax mov hIcon,rax
.endif .endif
mov note.hIcon,rax mov note.hIcon,rax
mov note.cbSize,SIZEOF TRAYICONDATAA mov note.cbSize,SIZEOF NOTIFYICONDATAW
mov rax,hWnd mov rax,hWnd
mov note.hWnd,rax mov note.hWnd,rax
mov note.uID,IDI_TRAY mov note.uID,IDI_TRAY
mov note.uFlags,NIF_ICON or NIF_MESSAGE or NIF_TIP mov note.uFlags,NIF_ICON or NIF_MESSAGE or NIF_TIP or NIF_SHOWTIP
mov note.uCallbackMessage,WM_SHELLNOTIFY mov note.uCallbackMessage,WM_SHELLNOTIFY
mov rax,hIcon mov rax,hIcon
mov note.hIcon,rax mov note.hIcon,rax
invoke lstrcpyA,addr note.szTip,addr AppName invoke lstrcpynW,addr note.szTip,addr AppName,128
invoke Shell_NotifyIconA,NIM_ADD,addr note invoke Shell_NotifyIconW,NIM_ADD,addr note
mov note.uTimeoutOrVersion,NOTIFYICON_VERSION_4
invoke Shell_NotifyIconW,NIM_SETVERSION,addr note
invoke SetThreadExecutionState,ES_CONTINUOUS or ES_SYSTEM_REQUIRED or ES_DISPLAY_REQUIRED invoke SetThreadExecutionState,ES_CONTINUOUS or ES_SYSTEM_REQUIRED or ES_DISPLAY_REQUIRED
.if rax==-1 .if rax==-1
@@ -79,16 +86,18 @@ WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
.elseif uMsg==WM_SIZE .elseif uMsg==WM_SIZE
.if wParam==SIZE_MINIMIZED .if wParam==SIZE_MINIMIZED
mov note.cbSize,SIZEOF TRAYICONDATAA mov note.cbSize,SIZEOF NOTIFYICONDATAW
mov rax,hWnd mov rax,hWnd
mov note.hWnd,rax mov note.hWnd,rax
mov note.uID,IDI_TRAY mov note.uID,IDI_TRAY
mov note.uFlags,NIF_ICON or NIF_MESSAGE or NIF_TIP mov note.uFlags,NIF_ICON or NIF_MESSAGE or NIF_TIP or NIF_SHOWTIP
mov note.uCallbackMessage,WM_SHELLNOTIFY mov note.uCallbackMessage,WM_SHELLNOTIFY
mov rax,hIcon mov rax,hIcon
mov note.hIcon,rax mov note.hIcon,rax
invoke lstrcpyA,addr note.szTip,addr AppName invoke lstrcpynW,addr note.szTip,addr AppName,128
invoke Shell_NotifyIconA,NIM_ADD,addr note invoke Shell_NotifyIconW,NIM_ADD,addr note
mov note.uTimeoutOrVersion,NOTIFYICON_VERSION_4
invoke Shell_NotifyIconW,NIM_SETVERSION,addr note
.if rax==0 .if rax==0
.else .else
invoke ShowWindow,hWnd,SW_HIDE invoke ShowWindow,hWnd,SW_HIDE
@@ -98,8 +107,16 @@ WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
ret ret
.elseif uMsg==WM_SHELLNOTIFY .elseif uMsg==WM_SHELLNOTIFY
.if wParam==IDI_TRAY mov rax,lParam
.if lParam==WM_LBUTTONDBLCLK mov edx,eax
and edx,0FFFFh
mov trayMsg,edx
shr eax,16
and eax,0FFFFh
mov trayId,eax
.if trayId==IDI_TRAY
.if trayMsg==WM_LBUTTONDBLCLK
.if sleepBlockEnabled==1 .if sleepBlockEnabled==1
invoke SetThreadExecutionState,ES_CONTINUOUS invoke SetThreadExecutionState,ES_CONTINUOUS
invoke LoadIcon,hInstance,IDI_ICON2 invoke LoadIcon,hInstance,IDI_ICON2
@@ -108,8 +125,9 @@ WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
.endif .endif
mov hIcon,rax mov hIcon,rax
mov note.hIcon,rax mov note.hIcon,rax
mov note.uFlags,NIF_ICON invoke lstrcpynW,addr note.szTip,addr AppName,128
invoke Shell_NotifyIconA,NIM_MODIFY,addr note mov note.uFlags,NIF_ICON or NIF_TIP or NIF_SHOWTIP
invoke Shell_NotifyIconW,NIM_MODIFY,addr note
mov sleepBlockEnabled,0 mov sleepBlockEnabled,0
.else .else
invoke SetThreadExecutionState,ES_CONTINUOUS or ES_SYSTEM_REQUIRED or ES_DISPLAY_REQUIRED invoke SetThreadExecutionState,ES_CONTINUOUS or ES_SYSTEM_REQUIRED or ES_DISPLAY_REQUIRED
@@ -119,12 +137,13 @@ WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
.endif .endif
mov hIcon,rax mov hIcon,rax
mov note.hIcon,rax mov note.hIcon,rax
mov note.uFlags,NIF_ICON invoke lstrcpynW,addr note.szTip,addr AppName,128
invoke Shell_NotifyIconA,NIM_MODIFY,addr note mov note.uFlags,NIF_ICON or NIF_TIP or NIF_SHOWTIP
invoke Shell_NotifyIconW,NIM_MODIFY,addr note
mov sleepBlockEnabled,1 mov sleepBlockEnabled,1
.endif .endif
.elseif lParam==WM_RBUTTONUP .elseif trayMsg==WM_CONTEXTMENU
invoke SetForegroundWindow,hWnd invoke SetForegroundWindow,hWnd
invoke GetCursorPos,addr pt invoke GetCursorPos,addr pt
invoke TrackPopupMenu,hPopupMenu,TPM_RIGHTBUTTON,pt.x,pt.y,0,hWnd,NULL invoke TrackPopupMenu,hPopupMenu,TPM_RIGHTBUTTON,pt.x,pt.y,0,hWnd,NULL
@@ -134,7 +153,31 @@ WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
ret ret
.elseif uMsg==WM_COMMAND .elseif uMsg==WM_COMMAND
.if wParam==IDM_EXIT .if wParam==IDM_DISABLESLEEP
invoke SetThreadExecutionState,ES_CONTINUOUS or ES_SYSTEM_REQUIRED or ES_DISPLAY_REQUIRED
invoke LoadIcon,hInstance,IDI_ICON
.if rax==0
invoke LoadIcon,NULL,IDI_APPLICATION
.endif
mov hIcon,rax
mov note.hIcon,rax
invoke lstrcpynW,addr note.szTip,addr AppName,128
mov note.uFlags,NIF_ICON or NIF_TIP or NIF_SHOWTIP
invoke Shell_NotifyIconW,NIM_MODIFY,addr note
mov sleepBlockEnabled,1
.elseif wParam==IDM_ENABLESLEEP
invoke SetThreadExecutionState,ES_CONTINUOUS
invoke LoadIcon,hInstance,IDI_ICON2
.if rax==0
invoke LoadIcon,NULL,IDI_APPLICATION
.endif
mov hIcon,rax
mov note.hIcon,rax
invoke lstrcpynW,addr note.szTip,addr AppName,128
mov note.uFlags,NIF_ICON or NIF_TIP or NIF_SHOWTIP
invoke Shell_NotifyIconW,NIM_MODIFY,addr note
mov sleepBlockEnabled,0
.elseif wParam==IDM_EXIT
invoke DestroyWindow,hWnd invoke DestroyWindow,hWnd
.endif .endif
mov rax,0 mov rax,0