mirror of
https://github.com/stasenso/Puer.git
synced 2026-06-26 21:32:42 +03:00
Add tray context menu with Exit action
This commit is contained in:
+46
-35
@@ -1,19 +1,17 @@
|
||||
include template.inc
|
||||
.code
|
||||
entry_point proc
|
||||
invoke GetModuleHandle, NULL ; Взять хэндл пpогpаммы
|
||||
mov hInstance,rax ; Под Win32, hmodule==hinstance mov hInstance,eax
|
||||
invoke GetModuleHandle, NULL
|
||||
mov hInstance,rax
|
||||
|
||||
invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT ; вызвать основную функцию
|
||||
invoke ExitProcess, rax ; Выйти из пpогpаммы.
|
||||
; Возвpащаемое значение, помещаемое в eax, беpется из WinMain'а.
|
||||
invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT
|
||||
invoke ExitProcess, rax
|
||||
entry_point endp
|
||||
;______________________________________________________________________________________________________________________________________________________________
|
||||
|
||||
WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:QWORD
|
||||
; создание локальных пеpеменных в стеке
|
||||
LOCAL msg:MSG
|
||||
LOCAL hwnd:HWND
|
||||
;регистрация оконного класса
|
||||
|
||||
push hInstance
|
||||
pop wc.hInstance
|
||||
invoke LoadIcon,wc.hInstance,IDI_ICON
|
||||
@@ -21,33 +19,38 @@ 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 ; pегистpация нашего класса окнаW
|
||||
invoke RegisterClassEx, addr wc
|
||||
invoke CreateWindowEx,NULL,ADDR szClassName,ADDR AppName,WS_OVERLAPPEDWINDOW,282,0,1354,1017,NULL,NULL,hInst,NULL
|
||||
mov hwnd,rax
|
||||
invoke ShowWindow,hwnd,CmdShow ; отобpазить наше окно на десктопе (вместо CmdShow можно указать свойство 3 - во весь экран)
|
||||
invoke UpdateWindow, hwnd ; обновить клиентскую область
|
||||
.while TRUE ; Enter message loop
|
||||
invoke ShowWindow,hwnd,CmdShow
|
||||
invoke UpdateWindow, hwnd
|
||||
|
||||
.while TRUE
|
||||
invoke GetMessage, ADDR msg,NULL,0,0
|
||||
.break .if (rax==0)
|
||||
invoke TranslateMessage, ADDR msg
|
||||
invoke DispatchMessage, ADDR msg
|
||||
.endw
|
||||
mov rax,msg.wParam ; сохpанение возвpащаемого значения в eax
|
||||
ret
|
||||
|
||||
mov rax,msg.wParam
|
||||
ret
|
||||
WinMain endp
|
||||
;______________________________________________________________________________________________________________________________________________________________
|
||||
|
||||
WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
|
||||
LOCAL hDC:HDC
|
||||
.if uMsg==WM_DESTROY ; если пользователь закpывает окно
|
||||
LOCAL pt:POINT
|
||||
|
||||
.if uMsg==WM_DESTROY
|
||||
invoke Shell_NotifyIconA,NIM_DELETE,addr note
|
||||
invoke DestroyMenu,hPopupMenu
|
||||
invoke SetThreadExecutionState,ES_CONTINUOUS
|
||||
invoke PostQuitMessage,NULL ; выходим из пpогpаммы
|
||||
invoke PostQuitMessage,NULL
|
||||
|
||||
.elseif uMsg==WM_CREATE
|
||||
invoke CreatePopupMenu
|
||||
mov hPopupMenu,rax ;Создаём pop-up меню для взаимодействия через трей
|
||||
invoke AppendMenuA,hPopupMenu,MF_STRING,IDM_RESTORE,addr RestoreString
|
||||
invoke AppendMenuA,hPopupMenu,MF_STRING,IDM_EXIT,addr ExitString
|
||||
mov hPopupMenu,rax
|
||||
invoke AppendMenuA,hPopupMenu,MF_STRING,IDM_EXIT,addr ExitString
|
||||
|
||||
invoke LoadIcon,hInstance,IDI_ICON
|
||||
mov hIcon,rax
|
||||
.if rax==0
|
||||
@@ -55,10 +58,10 @@ WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
|
||||
mov hIcon,rax
|
||||
.endif
|
||||
mov note.hIcon,rax
|
||||
;Запрещаем переход в сон и отключение дисплея
|
||||
|
||||
invoke SetThreadExecutionState,ES_CONTINUOUS or ES_SYSTEM_REQUIRED or ES_DISPLAY_REQUIRED
|
||||
.if rax ==-1
|
||||
invoke PostQuitMessage,NULL ; выходим из пpогpаммы
|
||||
.if rax==-1
|
||||
invoke PostQuitMessage,NULL
|
||||
.else
|
||||
mov sleepBlockEnabled,1
|
||||
mov rax,0
|
||||
@@ -84,6 +87,7 @@ WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
|
||||
.endif
|
||||
mov rax,0
|
||||
ret
|
||||
|
||||
.elseif uMsg==WM_SHELLNOTIFY
|
||||
.if wParam==IDI_TRAY
|
||||
.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
|
||||
mov sleepBlockEnabled,1
|
||||
.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
|
||||
mov rax,0
|
||||
ret
|
||||
|
||||
.elseif uMsg==WM_COMMAND
|
||||
.if wParam==IDM_EXIT
|
||||
invoke DestroyWindow,hWnd
|
||||
.endif
|
||||
mov rax,0
|
||||
ret
|
||||
|
||||
.elseif uMsg==WM_PAINT
|
||||
invoke myPaint,hWnd
|
||||
|
||||
.elseif uMsg==WM_ERASEBKGND
|
||||
mov rax,TRUE
|
||||
ret
|
||||
.else
|
||||
invoke DefWindowProc,hWnd,uMsg,wParam,lParam ; Дефолтная функция обpаботки окна
|
||||
|
||||
.else
|
||||
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
|
||||
ret
|
||||
.endif
|
||||
xor rax,rax
|
||||
|
||||
xor rax,rax
|
||||
ret
|
||||
WndProc endp
|
||||
;______________________________________________________________________________________________________________________________________________________________
|
||||
|
||||
;______________________________________________________________________________________________________________________________________________________________
|
||||
|
||||
;______________________________________________________________________________________________________________________________________________________________
|
||||
myPaint proc hWndPaint:HWND
|
||||
LOCAL ps:PAINTSTRUCT
|
||||
invoke BeginPaint,hWndPaint,ptr$(ps) ;тут создаётся контекст устройства окна
|
||||
|
||||
|
||||
invoke BeginPaint,hWndPaint,ptr$(ps)
|
||||
invoke EndPaint,hWndPaint,ptr$(ps)
|
||||
ret
|
||||
myPaint endp
|
||||
|
||||
end
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user