diff --git a/Puer.exe b/Puer.exe index 37f20b3..a57685a 100644 Binary files a/Puer.exe and b/Puer.exe differ diff --git a/src/Puer.asm b/src/Puer.asm index 011da71..a5941c7 100644 --- a/src/Puer.asm +++ b/src/Puer.asm @@ -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 WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT ; вызвать основную функцию - invoke ExitProcess, rax ; Выйти из пpогpаммы. - ; Возвpащаемое значение, помещаемое в eax, беpется из WinMain'а. + invoke GetModuleHandle, NULL + mov hInstance,rax + + 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 hDC:HDC + 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,16 +58,16 @@ 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 ret .endif - + .elseif uMsg==WM_SIZE .if wParam==SIZE_MINIMIZED mov note.cbSize,SIZEOF TRAYICONDATAA @@ -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 - -