mirror of
https://github.com/stasenso/Puer.git
synced 2026-06-26 21:32:42 +03:00
feat(tray): add Unicode sleep toggle menu and preserve tray tooltip on icon updates
This commit is contained in:
+42
-20
@@ -1,33 +1,51 @@
|
|||||||
|
__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 ?
|
||||||
uID DWORD ?
|
uID DWORD ?
|
||||||
uFlags DWORD ?
|
uFlags DWORD ?
|
||||||
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
@@ -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
|
||||||
|
|
||||||
|
|||||||
Binary file not shown.
+63
-20
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user