diff --git a/Puer.exe b/Puer.exe index fffaca5..003b666 100644 Binary files a/Puer.exe and b/Puer.exe differ diff --git a/include/template.inc b/include/template.inc index 9a123b3..8f31cd7 100644 --- a/include/template.inc +++ b/include/template.inc @@ -1,33 +1,51 @@ +__UNICODE__ equ 1 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 -;______________________Прототипы__________________________ +;______________________Prototypes__________________________ WinMain proto :HINSTANCE,:HINSTANCE,:LPSTR,:QWORD -myPaint proto :HWND ;Обработка сообщения WM_PAINT -myDraw proto nSegment:DWORD ;принимаю параметр с колличеством сегментов (в HIWORD) и номером данного сегмента (в LOWORD) +myPaint proto :HWND ; WM_PAINT handler +myDraw proto nSegment:DWORD ; segment draw helper 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? -hInstance HINSTANCE ? ; Хэндл нашей пpогpаммы +hInstance HINSTANCE ? ; app instance handle CommandLine LPSTR ? hIcon dq ? sleepBlockEnabled dq ? -TRAYICONDATAA STRUCT - cbSize DWORD ? - _pad0 DWORD ? - hWnd QWORD ? - uID DWORD ? - uFlags DWORD ? - uCallbackMessage DWORD ? - _pad1 DWORD ? - hIcon QWORD ? - szTip BYTE 128 dup(?) -TRAYICONDATAA ENDS +NOTIFYICONDATAW STRUCT + cbSize DWORD ? + _pad0 DWORD ? + hWnd QWORD ? + uID DWORD ? + uFlags DWORD ? + uCallbackMessage DWORD ? + _pad1 DWORD ? + hIcon QWORD ? + szTip WORD 128 dup(?) + 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 biSize DWORD ?; @@ -56,18 +74,22 @@ hPopupMenu dq ? ;_______________________________________________________ .data -szClassName db "CocaClass",0 ; Имя нашего класса окна -AppName db "Pu'er tea: no sleeping on the job!",0 ; Имя нашего окна +szClassName dw "C","o","c","a","C","l","a","s","s",0 ; window class name +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 IDT_UPDTIMER EQU 111 wc WNDCLASSEX bmi BITMAPINFO <> rc RECT <> -RestoreString db "&Restore",0 -ExitString db "E&xit Program",0 -note TRAYICONDATAA <> +RestoreString dw "&","R","e","s","t","o","r","e",0 +ExitString dw 0412h,0026h,044bh,0445h,043eh,0434h,0 +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 IDM_RESTORE equ 1000 +IDM_ENABLESLEEP equ 1100 +IDM_DISABLESLEEP equ 1110 IDM_EXIT equ 1010 diff --git a/res/rsrc.rc b/res/rsrc.rc index 8d0b35d..df9cdba 100644 --- a/res/rsrc.rc +++ b/res/rsrc.rc @@ -27,7 +27,7 @@ BEGIN VALUE "OriginalFilename", "Puer.exe\000" VALUE "LegalCopyright", "\251 2025 Friends of Svetopaper\000" VALUE "ProductName", "Pu'er tea\000" - VALUE "ProductVersion", "1.0\000" + VALUE "ProductVersion", "1.2\000" END END diff --git a/res/rsrc.res b/res/rsrc.res index c95dc6f..9e9e96e 100644 Binary files a/res/rsrc.res and b/res/rsrc.res differ diff --git a/src/Puer.asm b/src/Puer.asm index d142fb3..1f681a7 100644 --- a/src/Puer.asm +++ b/src/Puer.asm @@ -19,8 +19,8 @@ WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:QWORD mov wc.hIconSm,rax invoke LoadCursor,NULL,IDC_ARROW mov wc.hCursor,rax - invoke RegisterClassEx, addr wc - invoke CreateWindowEx,NULL,ADDR szClassName,ADDR AppName,WS_OVERLAPPEDWINDOW,282,0,1354,1017,NULL,NULL,hInst,NULL + invoke RegisterClassExW, addr wc + invoke CreateWindowExW,NULL,ADDR szClassName,ADDR AppName,WS_OVERLAPPEDWINDOW,282,0,1354,1017,NULL,NULL,hInst,NULL mov hwnd,rax invoke ShowWindow,hwnd,SW_HIDE @@ -38,9 +38,11 @@ WinMain endp WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM LOCAL hDC:HDC LOCAL pt:POINT + LOCAL trayMsg:DWORD + LOCAL trayId:DWORD .if uMsg==WM_DESTROY - invoke Shell_NotifyIconA,NIM_DELETE,addr note + invoke Shell_NotifyIconW,NIM_DELETE,addr note invoke DestroyMenu,hPopupMenu invoke SetThreadExecutionState,ES_CONTINUOUS invoke PostQuitMessage,NULL @@ -48,7 +50,10 @@ WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM .elseif uMsg==WM_CREATE invoke CreatePopupMenu 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 mov hIcon,rax @@ -57,16 +62,18 @@ WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM mov hIcon,rax .endif mov note.hIcon,rax - mov note.cbSize,SIZEOF TRAYICONDATAA + mov note.cbSize,SIZEOF NOTIFYICONDATAW 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.uFlags,NIF_ICON or NIF_MESSAGE or NIF_TIP or NIF_SHOWTIP 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 + invoke lstrcpynW,addr note.szTip,addr AppName,128 + 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 .if rax==-1 @@ -79,16 +86,18 @@ WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM .elseif uMsg==WM_SIZE .if wParam==SIZE_MINIMIZED - mov note.cbSize,SIZEOF TRAYICONDATAA + mov note.cbSize,SIZEOF NOTIFYICONDATAW 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.uFlags,NIF_ICON or NIF_MESSAGE or NIF_TIP or NIF_SHOWTIP 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 + invoke lstrcpynW,addr note.szTip,addr AppName,128 + invoke Shell_NotifyIconW,NIM_ADD,addr note + mov note.uTimeoutOrVersion,NOTIFYICON_VERSION_4 + invoke Shell_NotifyIconW,NIM_SETVERSION,addr note .if rax==0 .else invoke ShowWindow,hWnd,SW_HIDE @@ -98,8 +107,16 @@ WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM ret .elseif uMsg==WM_SHELLNOTIFY - .if wParam==IDI_TRAY - .if lParam==WM_LBUTTONDBLCLK + mov rax,lParam + 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 invoke SetThreadExecutionState,ES_CONTINUOUS invoke LoadIcon,hInstance,IDI_ICON2 @@ -108,8 +125,9 @@ WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM .endif mov hIcon,rax mov note.hIcon,rax - mov note.uFlags,NIF_ICON - invoke Shell_NotifyIconA,NIM_MODIFY,addr note + 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 .else 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 mov hIcon,rax mov note.hIcon,rax - mov note.uFlags,NIF_ICON - invoke Shell_NotifyIconA,NIM_MODIFY,addr note + 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 .endif - .elseif lParam==WM_RBUTTONUP + .elseif trayMsg==WM_CONTEXTMENU invoke SetForegroundWindow,hWnd invoke GetCursorPos,addr pt 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 .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 .endif mov rax,0