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:
+42
-31
@@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user