Add tray context menu with Exit action

This commit is contained in:
Stanislav N Mikhailov
2026-02-25 22:40:28 +03:00
parent 868fa480dd
commit 128f09113c
2 changed files with 49 additions and 38 deletions
BIN
View File
Binary file not shown.
+43 -32
View File
@@ -1,19 +1,17 @@
include template.inc include template.inc
.code .code
entry_point proc entry_point proc
invoke GetModuleHandle, NULL ; Взять хэндл пpогpаммы invoke GetModuleHandle, NULL
mov hInstance,rax ; Под Win32, hmodule==hinstance mov hInstance,eax mov hInstance,rax
invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT ; вызвать основную функцию invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT
invoke ExitProcess, rax ; Выйти из пpогpаммы. invoke ExitProcess, rax
; Возвpащаемое значение, помещаемое в eax, беpется из WinMain'а.
entry_point endp entry_point endp
;______________________________________________________________________________________________________________________________________________________________
WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:QWORD WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:QWORD
; создание локальных пеpеменных в стеке
LOCAL msg:MSG LOCAL msg:MSG
LOCAL hwnd:HWND LOCAL hwnd:HWND
;регистрация оконного класса
push hInstance push hInstance
pop wc.hInstance pop wc.hInstance
invoke LoadIcon,wc.hInstance,IDI_ICON invoke LoadIcon,wc.hInstance,IDI_ICON
@@ -21,33 +19,38 @@ 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 ; pегистpация нашего класса окнаW invoke RegisterClassEx, addr wc
invoke CreateWindowEx,NULL,ADDR szClassName,ADDR AppName,WS_OVERLAPPEDWINDOW,282,0,1354,1017,NULL,NULL,hInst,NULL invoke CreateWindowEx,NULL,ADDR szClassName,ADDR AppName,WS_OVERLAPPEDWINDOW,282,0,1354,1017,NULL,NULL,hInst,NULL
mov hwnd,rax mov hwnd,rax
invoke ShowWindow,hwnd,CmdShow ; отобpазить наше окно на десктопе (вместо CmdShow можно указать свойство 3 - во весь экран) invoke ShowWindow,hwnd,CmdShow
invoke UpdateWindow, hwnd ; обновить клиентскую область invoke UpdateWindow, hwnd
.while TRUE ; Enter message loop
.while TRUE
invoke GetMessage, ADDR msg,NULL,0,0 invoke GetMessage, ADDR msg,NULL,0,0
.break .if (rax==0) .break .if (rax==0)
invoke TranslateMessage, ADDR msg invoke TranslateMessage, ADDR msg
invoke DispatchMessage, ADDR msg invoke DispatchMessage, ADDR msg
.endw .endw
mov rax,msg.wParam ; сохpанение возвpащаемого значения в eax
mov rax,msg.wParam
ret ret
WinMain endp 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
.if uMsg==WM_DESTROY ; если пользователь закpывает окно LOCAL pt:POINT
.if uMsg==WM_DESTROY
invoke Shell_NotifyIconA,NIM_DELETE,addr note invoke Shell_NotifyIconA,NIM_DELETE,addr note
invoke DestroyMenu,hPopupMenu invoke DestroyMenu,hPopupMenu
invoke SetThreadExecutionState,ES_CONTINUOUS invoke SetThreadExecutionState,ES_CONTINUOUS
invoke PostQuitMessage,NULL ; выходим из пpогpаммы invoke PostQuitMessage,NULL
.elseif uMsg==WM_CREATE .elseif uMsg==WM_CREATE
invoke CreatePopupMenu invoke CreatePopupMenu
mov hPopupMenu,rax ;Создаём pop-up меню для взаимодействия через трей mov hPopupMenu,rax
invoke AppendMenuA,hPopupMenu,MF_STRING,IDM_RESTORE,addr RestoreString
invoke AppendMenuA,hPopupMenu,MF_STRING,IDM_EXIT,addr ExitString invoke AppendMenuA,hPopupMenu,MF_STRING,IDM_EXIT,addr ExitString
invoke LoadIcon,hInstance,IDI_ICON invoke LoadIcon,hInstance,IDI_ICON
mov hIcon,rax mov hIcon,rax
.if rax==0 .if rax==0
@@ -55,10 +58,10 @@ 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
;Запрещаем переход в сон и отключение дисплея
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
invoke PostQuitMessage,NULL ; выходим из пpогpаммы invoke PostQuitMessage,NULL
.else .else
mov sleepBlockEnabled,1 mov sleepBlockEnabled,1
mov rax,0 mov rax,0
@@ -84,6 +87,7 @@ WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
.endif .endif
mov rax,0 mov rax,0
ret ret
.elseif uMsg==WM_SHELLNOTIFY .elseif uMsg==WM_SHELLNOTIFY
.if wParam==IDI_TRAY .if wParam==IDI_TRAY
.if lParam==WM_LBUTTONDBLCLK .if lParam==WM_LBUTTONDBLCLK
@@ -110,37 +114,44 @@ WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
invoke Shell_NotifyIconA,NIM_MODIFY,addr note invoke Shell_NotifyIconA,NIM_MODIFY,addr note
mov sleepBlockEnabled,1 mov sleepBlockEnabled,1
.endif .endif
.elseif lParam==WM_RBUTTONUP
invoke SetForegroundWindow,hWnd
invoke GetCursorPos,addr pt
invoke TrackPopupMenu,hPopupMenu,TPM_RIGHTBUTTON,pt.x,pt.y,0,hWnd,NULL
.endif .endif
.endif .endif
mov rax,0 mov rax,0
ret ret
.elseif uMsg==WM_COMMAND
.if wParam==IDM_EXIT
invoke DestroyWindow,hWnd
.endif
mov rax,0
ret
.elseif uMsg==WM_PAINT .elseif uMsg==WM_PAINT
invoke myPaint,hWnd invoke myPaint,hWnd
.elseif uMsg==WM_ERASEBKGND .elseif uMsg==WM_ERASEBKGND
mov rax,TRUE mov rax,TRUE
ret ret
.else .else
invoke DefWindowProc,hWnd,uMsg,wParam,lParam ; Дефолтная функция обpаботки окна invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret ret
.endif .endif
xor rax,rax
xor rax,rax
ret ret
WndProc endp WndProc endp
;______________________________________________________________________________________________________________________________________________________________
;______________________________________________________________________________________________________________________________________________________________
;______________________________________________________________________________________________________________________________________________________________
myPaint proc hWndPaint:HWND myPaint proc hWndPaint:HWND
LOCAL ps:PAINTSTRUCT LOCAL ps:PAINTSTRUCT
invoke BeginPaint,hWndPaint,ptr$(ps) ;тут создаётся контекст устройства окна invoke BeginPaint,hWndPaint,ptr$(ps)
invoke EndPaint,hWndPaint,ptr$(ps) invoke EndPaint,hWndPaint,ptr$(ps)
ret ret
myPaint endp myPaint endp
end end