У меня такой вопрос - как можно реализовать в Масм/Фасм функцию типа "таймер"? В плане, чтобы через определенное, заданное мной время программа кое-что делала. Может существует какая-то Апи функция или стандартное средство?
Нужно, например, такое: проверять каждую секунду, не запущена ли определенная программа. Или отправлять пинг-запросы на сайт через каждые 2-3 секунды. Или запускать определенную процедуру каждые 15-20 минут.
M0rg0t Есть еще такая возможность Код (Text): C:\>at ? Команда AT предназначена для запуска команд и программ в указанное время по определенным дням. Для использования команды AT необходимо, чтобы была запущена служба расписаний. AT [\\имя_компьютера] [ [код] [/DELETE] | /DELETE [/YES]] AT [\\имя_компьютера] время [/INTERACTIVE] [ /EVERY:день[,...] | /NEXT:день[,...]] "команда" \\имя_компьютера Имя удаленного компьютера. Если этот параметр опущен, используется локальный компьютер. код Порядковый номер запланированной задачи. /delete Отмена запланированной задачи. Если код задачи опущен, отменяются все задачи, запланированные для указанного компьютера. /yes Отмена запроса на подтверждение при отмене всех запланированных задач. время Время запуска команды. /interactive Разрешение взаимодействия задачи с пользователем, работающим на компьютере во время запуска задачи. /every:день[,...] Запуск задачи осуществляется по указанным дням недели или месяца. Если дата опущена, используется текущий день месяца. /next:день[,...] Задача будет запущена в следующий указанный день недели (например в следующий четверг). Если дата опущена, используется текущий день месяца. "команда" Команда Windows NT или имя пакетного файла.
Ребята, помогите создать таймер на месажбоксе. Тут http://www.codeproject.com/KB/dialog/delaymessagebox.aspx вроде есть готовый пример, но у меня не получается его откомпилировать.
Код (Text): extern _imp__CallNextHookEx@16:dword extern _imp__DeleteMenu@12:dword extern _imp__GetCurrentThreadId@0:dword extern _imp__GetDlgItem@8:dword extern _imp__GetSystemMenu@8:dword extern _imp__LoadLibraryA@4:dword extern _imp__LoadStringA@16:dword extern _imp__MessageBoxA@16:dword extern _imp__SetWindowsHookExA@16:dword extern _imp__SetWindowTextA@8:dword extern _imp__UnhookWindowsHookEx@4:dword .data? bufCaption db MAX_PATH dup(?) bufButton db MAX_PATH dup(?) hHook dd ? .code CBTProc proc nCode:DWORD,wParam:DWORD,lParam:DWORD xor eax,eax cmp nCode,eax jge @f push lParam push wParam push nCode push eax call _imp__CallNextHookEx@16 jmp @e @@: cmp nCode,HCBT_ACTIVATE jne @e push IDOK push wParam call _imp__GetDlgItem@8 push offset bufButton push eax call _imp__SetWindowTextA@8 push FALSE push wParam call _imp__GetSystemMenu@8 push MF_BYCOMMAND push SC_CLOSE push eax call _imp__DeleteMenu@12 push hHook call _imp__UnhookWindowsHookEx@4 @e: ret CBTProc endp start: xchg ebx,eax push offset szUser32 call _imp__LoadLibraryA@4 push sizeof bufButton push offset bufButton push 802 push eax call _imp__LoadStringA@16 push offset szShell32 call _imp__LoadLibraryA@4 push sizeof bufCaption push offset bufCaption push 17243 push eax call _imp__LoadStringA@16 call _imp__GetCurrentThreadId@0 push eax push ebx push offset CBTProc push WH_CBT call _imp__SetWindowsHookExA@16 mov hHook,eax push MB_OK or MB_ICONSTOP or MB_SYSTEMMODAL push offset bufCaption push ebx push ebx call _imp__MessageBoxA@16 ret szUser32 db 'user32',0 szShell32 db 'shell32',0 end start Это всё, что у меня получилось. Дальше не знаю.
А чего так сложно? Есть специальные Мессадж боксы с таймером, ниже мессадж бокс, который пропадает через 5 секунд Код (Text): .586 .model flat .code include windows.inc includelib user32.lib extern _imp__MessageBoxTimeoutA@24:dword start: push 5000;время в миллисекундах push 0;идентификатор языка push MB_ICONASTERISK or MB_OK;стиль окна сообщений push offset Msg;адрес заголовка в окне сообщений push offset Msg;адрес текста в окне сообщений push 0;дескриптор окна владельца call _imp__MessageBoxTimeoutA@24 retn Msg db 'Hi',0 end start
gale1238 зачем делать сложным то что проще простого? Код (Text): .586 .model flat .code include windows.inc includelib user32.lib extern _imp__wsprintfA:dword extern _imp__MessageBoxTimeoutA@24:dword start: mov edi,50 @@: push edi push offset fmt push offset Msg call _imp__wsprintfA add esp,12 push 90;время push 0;идентификатор языка push MB_ICONASTERISK or MB_OK;стиль окна сообщений push offset MsgCaption;адрес заголовка в окне сообщений push offset Msg;адрес текста в окне сообщений push 0;дескриптор окна владельца call _imp__MessageBoxTimeoutA@24 dec edi jnz @b retn MsgCaption db 'Hi',0 Msg db 60 dup (0) fmt db 'до форматирования диска С:\ осталось %d секунд',0 end start
Mikl___ В вашем примере окно моргает. Это некрасиво. Код (Text): extern _imp__AttachThreadInput@12:dword extern _imp__CallNextHookEx@16:dword extern _imp__DeleteMenu@12:dword extern _imp__FreeLibrary@4:dword extern _imp__GetCurrentThreadId@0:dword extern _imp__GetDlgItem@8:dword extern _imp__GetForegroundWindow@0:dword extern _imp__GetSystemMenu@8:dword extern _imp__GetWindowThreadProcessId@8:dword extern _imp__KillTimer@8:dword extern _imp__LoadLibraryA@4:dword extern _imp__LoadStringA@16:dword extern _imp__MessageBoxA@16:dword extern _imp__PostMessageA@16:dword extern _imp__SetForegroundWindow@4:dword extern _imp__SetTimer@16:dword extern _imp__SetWindowsHookExA@16:dword extern _imp__SetWindowTextA@8:dword extern _imp__ShellExecuteA@24:dword extern _imp__UnhookWindowsHookEx@4:dword .data? bufText db 16 dup(?) bufButton db 16 dup(?) hHook dd ? hWnd dd ? .data count db 15 ;максимум 59 секунд szShell32 db 'shell32',0 szUser32 db 'user32',0 .code CBTProc proc uses ebx edi esi,nCode:DWORD,wParam:DWORD,lParam:DWORD xor eax,eax cmp nCode,eax jge @f push lParam push wParam push nCode push eax call _imp__CallNextHookEx@16 jmp @e @@: cmp nCode,HCBT_ACTIVATE jne @e push IDOK push wParam call _imp__GetDlgItem@8 push offset bufButton push eax call _imp__SetWindowTextA@8 push FALSE push wParam call _imp__GetSystemMenu@8 push MF_BYCOMMAND push SC_CLOSE push eax call _imp__DeleteMenu@12 push wParam pop hWnd call toTop push hHook call _imp__UnhookWindowsHookEx@4 @e: ret CBTProc endp DigitToChar proc mov al,count mov edx,offset bufText xor ecx,ecx @@: cmp al,10 jb @f inc cl sub al,10 jmp @b @@: jecxz @f add cl,48 mov byte ptr [edx],cl @@: inc edx add al,48 mov byte ptr [edx],al xor eax,eax jecxz @f inc eax @@: ret DigitToChar endp TimerProc proc uses edi esi,hwnd:DWORD,uMsg:DWORD,idEvent:DWORD,dwTime:DWORD dec count cmp count,-1 jz @f mov edi,offset bufText+1 call DigitToChar sub edi,eax push edi push hWnd call _imp__SetWindowTextA@8 push 65535 push hWnd call _imp__GetDlgItem@8 push edi push eax call _imp__SetWindowTextA@8 call toTop jmp @e @@: push eax push eax push WM_CLOSE push hWnd call _imp__PostMessageA@16 @e: ret TimerProc endp toTop proc uses edi esi call _imp__GetForegroundWindow@0 push NULL push eax call _imp__GetWindowThreadProcessId@8 mov esi,eax push NULL push hWnd call _imp__GetWindowThreadProcessId@8 mov edi,eax push TRUE push esi push eax call _imp__AttachThreadInput@12 push hWnd call _imp__SetForegroundWindow@4 push FALSE push esi push edi call _imp__AttachThreadInput@12 ret toTop endp start: xchg ebx,eax cmp count,59 jbe @f mov count,59 @@: push offset szUser32 call _imp__LoadLibraryA@4 push eax push sizeof bufButton push offset bufButton push 802 push eax call _imp__LoadStringA@16 call _imp__FreeLibrary@4 push offset szShell32 call _imp__LoadLibraryA@4 push eax mov edi,offset bufText push sizeof bufText push edi push 17243 push eax call _imp__LoadStringA@16 call _imp__FreeLibrary@4 inc edi call DigitToChar sub edi,eax call _imp__GetCurrentThreadId@0 push eax push ebx push offset CBTProc push WH_CBT call _imp__SetWindowsHookExA@16 mov hHook,eax push offset TimerProc push 1000 push ebx push ebx call _imp__SetTimer@16 push eax push MB_OK or MB_ICONSTOP or MB_SYSTEMMODAL push edi push edi push ebx call _imp__MessageBoxA@16 push ebx call _imp__KillTimer@8 ret end start Если после запуска нажимать только на клавишу 'ввод', то окно никак не реагирует. Как окну передать клавиатурный фокус?