Таймер и другие функции в Асме - как реализовать?

Тема в разделе "WASM.BEGINNERS", создана пользователем M0rg0t, 12 мар 2011.

  1. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.576
    У меня такой вопрос - как можно реализовать в Масм/Фасм функцию типа "таймер"? В плане, чтобы через определенное, заданное мной время программа кое-что делала. Может существует какая-то Апи функция или стандартное средство?
     
  2. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
  3. Kaimi

    Kaimi Андрей

    Публикаций:
    0
    Регистрация:
    15 апр 2010
    Сообщения:
    120
    http://msdn.microsoft.com/en-us/library/ms644906%28v=vs.85%29.aspx
     
  4. fsd

    fsd New Member

    Публикаций:
    0
    Регистрация:
    4 июл 2010
    Сообщения:
    353
  5. asmlamo

    asmlamo Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 май 2004
    Сообщения:
    1.734
    KillTimer
    QueryPerformanceCounter
    QueryPerformanceFrequency
    SetTimer
    TimerProc
     
  6. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.576
    Большое спасибо всем за ответы.
     
  7. kernel16

    kernel16 Human Vl

    Публикаций:
    0
    Регистрация:
    29 окт 2010
    Сообщения:
    316
    можно просто через Sleep, ну это смотря что именно нужно
     
  8. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.576
    Нужно, например, такое: проверять каждую секунду, не запущена ли определенная программа. Или отправлять пинг-запросы на сайт через каждые 2-3 секунды. Или запускать определенную процедуру каждые 15-20 минут.
     
  9. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    M0rg0t
    вам апи уже сказали для всех перечисленных задач.
     
  10. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.576
    spa я это понял, просто ответил kernel16 на его фразу "для чего нужно".
     
  11. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    M0rg0t
    Есть еще такая возможность
    Код (Text):
    1. C:\>at ?
    2.  
    3. Команда AT предназначена для запуска команд и программ в указанное время
    4. по определенным дням. Для использования команды AT необходимо, чтобы была
    5. запущена служба расписаний.
    6.  
    7. AT [\\имя_компьютера] [ [код] [/DELETE] | /DELETE [/YES]]
    8. AT [\\имя_компьютера] время [/INTERACTIVE]
    9.     [ /EVERY:день[,...] | /NEXT:день[,...]] "команда"
    10.  
    11. \\имя_компьютера   Имя удаленного компьютера. Если этот параметр опущен,
    12.                    используется локальный компьютер.
    13. код                Порядковый номер запланированной задачи.
    14. /delete            Отмена запланированной задачи. Если код задачи опущен,
    15.                    отменяются все задачи, запланированные для указанного
    16.                    компьютера.
    17. /yes               Отмена запроса на подтверждение при отмене всех
    18.                    запланированных задач.
    19. время              Время запуска команды.
    20. /interactive       Разрешение взаимодействия задачи с пользователем,
    21.                    работающим на компьютере во время запуска задачи.
    22. /every:день[,...]  Запуск задачи осуществляется по указанным дням недели или
    23.                    месяца. Если дата опущена, используется текущий день
    24.                    месяца.
    25. /next:день[,...]   Задача будет запущена в следующий указанный день недели
    26.                    (например в следующий четверг). Если дата опущена,
    27.                    используется текущий день месяца.
    28. "команда"          Команда Windows NT или имя пакетного файла.
     
  12. gale1238

    gale1238 New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2009
    Сообщения:
    72
    Ребята, помогите создать таймер на месажбоксе.
    Тут http://www.codeproject.com/KB/dialog/delaymessagebox.aspx вроде есть готовый пример, но у меня не получается его откомпилировать.
     
  13. gale1238

    gale1238 New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2009
    Сообщения:
    72
    Код (Text):
    1. extern _imp__CallNextHookEx@16:dword
    2. extern _imp__DeleteMenu@12:dword
    3. extern _imp__GetCurrentThreadId@0:dword
    4. extern _imp__GetDlgItem@8:dword
    5. extern _imp__GetSystemMenu@8:dword
    6. extern _imp__LoadLibraryA@4:dword
    7. extern _imp__LoadStringA@16:dword
    8. extern _imp__MessageBoxA@16:dword
    9. extern _imp__SetWindowsHookExA@16:dword
    10. extern _imp__SetWindowTextA@8:dword
    11. extern _imp__UnhookWindowsHookEx@4:dword
    12. .data?
    13.     bufCaption db MAX_PATH dup(?)
    14.     bufButton db MAX_PATH dup(?)
    15.     hHook dd ?
    16. .code
    17. CBTProc proc nCode:DWORD,wParam:DWORD,lParam:DWORD
    18.     xor eax,eax
    19.     cmp nCode,eax
    20.     jge @f
    21.         push lParam
    22.         push wParam
    23.         push nCode
    24.         push eax
    25.     call _imp__CallNextHookEx@16
    26.     jmp @e
    27. @@: cmp nCode,HCBT_ACTIVATE
    28.     jne @e
    29.         push IDOK
    30.         push wParam
    31.     call _imp__GetDlgItem@8
    32.         push offset bufButton
    33.         push eax
    34.     call _imp__SetWindowTextA@8
    35.         push FALSE
    36.         push wParam
    37.     call _imp__GetSystemMenu@8
    38.         push MF_BYCOMMAND
    39.         push SC_CLOSE
    40.         push eax
    41.     call _imp__DeleteMenu@12
    42.         push hHook
    43.     call _imp__UnhookWindowsHookEx@4
    44. @e: ret
    45. CBTProc endp
    46. start:
    47.     xchg ebx,eax
    48.         push offset szUser32
    49.     call _imp__LoadLibraryA@4
    50.         push sizeof bufButton
    51.         push offset bufButton
    52.         push 802
    53.         push eax
    54.     call _imp__LoadStringA@16
    55.         push offset szShell32
    56.     call _imp__LoadLibraryA@4
    57.         push sizeof bufCaption
    58.         push offset bufCaption
    59.         push 17243
    60.         push eax
    61.     call _imp__LoadStringA@16
    62.     call _imp__GetCurrentThreadId@0
    63.         push eax
    64.         push ebx
    65.         push offset CBTProc
    66.         push WH_CBT
    67.     call _imp__SetWindowsHookExA@16
    68.     mov hHook,eax
    69.         push MB_OK or MB_ICONSTOP or MB_SYSTEMMODAL
    70.         push offset bufCaption
    71.         push ebx
    72.         push ebx
    73.     call _imp__MessageBoxA@16
    74.     ret
    75.     szUser32 db 'user32',0
    76.     szShell32 db 'shell32',0
    77. end start
    Это всё, что у меня получилось. Дальше не знаю.
     
  14. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    А чего так сложно? Есть специальные Мессадж боксы с таймером, ниже мессадж бокс, который пропадает через 5 секунд
    Код (Text):
    1. .586
    2. .model flat
    3. .code
    4. include windows.inc
    5. includelib user32.lib
    6. extern _imp__MessageBoxTimeoutA@24:dword
    7. start:  push 5000;время в миллисекундах
    8.         push 0;идентификатор языка
    9.         push MB_ICONASTERISK or MB_OK;стиль окна сообщений
    10.         push offset Msg;адрес заголовка в окне сообщений
    11.         push offset Msg;адрес текста в окне сообщений
    12.         push 0;дескриптор окна владельца
    13.         call _imp__MessageBoxTimeoutA@24
    14.     retn
    15. Msg db 'Hi',0
    16. end start
     
  15. gale1238

    gale1238 New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2009
    Сообщения:
    72
    Mikl___
    Хочется в заголовке окна отобразить обратный отсчёт времени.
     
  16. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    gale1238
    зачем делать сложным
    то что проще простого?
    Код (Text):
    1. .586
    2. .model flat
    3. .code
    4. include windows.inc
    5. includelib user32.lib
    6. extern _imp__wsprintfA:dword
    7. extern _imp__MessageBoxTimeoutA@24:dword
    8. start:  mov edi,50
    9. @@: push edi
    10.     push offset fmt
    11.     push offset Msg
    12.     call _imp__wsprintfA
    13.     add esp,12
    14.     push 90;время
    15.         push 0;идентификатор языка
    16.         push MB_ICONASTERISK or MB_OK;стиль окна сообщений
    17.         push offset MsgCaption;адрес заголовка в окне сообщений
    18.         push offset Msg;адрес текста в окне сообщений
    19.         push 0;дескриптор окна владельца
    20.         call _imp__MessageBoxTimeoutA@24
    21.     dec  edi
    22.     jnz @b
    23.     retn
    24. MsgCaption db 'Hi',0
    25. Msg db 60 dup (0)
    26. fmt db 'до форматирования диска С:\ осталось %d секунд',0
    27. end start
    [​IMG]
     
  17. gale1238

    gale1238 New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2009
    Сообщения:
    72
    Mikl___
    В вашем примере окно моргает. Это некрасиво.
    Код (Text):
    1. extern _imp__AttachThreadInput@12:dword
    2. extern _imp__CallNextHookEx@16:dword
    3. extern _imp__DeleteMenu@12:dword
    4. extern _imp__FreeLibrary@4:dword
    5. extern _imp__GetCurrentThreadId@0:dword
    6. extern _imp__GetDlgItem@8:dword
    7. extern _imp__GetForegroundWindow@0:dword
    8. extern _imp__GetSystemMenu@8:dword
    9. extern _imp__GetWindowThreadProcessId@8:dword
    10. extern _imp__KillTimer@8:dword
    11. extern _imp__LoadLibraryA@4:dword
    12. extern _imp__LoadStringA@16:dword
    13. extern _imp__MessageBoxA@16:dword
    14. extern _imp__PostMessageA@16:dword
    15. extern _imp__SetForegroundWindow@4:dword
    16. extern _imp__SetTimer@16:dword
    17. extern _imp__SetWindowsHookExA@16:dword
    18. extern _imp__SetWindowTextA@8:dword
    19. extern _imp__ShellExecuteA@24:dword
    20. extern _imp__UnhookWindowsHookEx@4:dword
    21. .data?
    22.     bufText db 16 dup(?)
    23.     bufButton db 16 dup(?)
    24.     hHook dd ?
    25.     hWnd dd ?
    26. .data
    27.     count db 15 ;максимум 59 секунд
    28.     szShell32 db 'shell32',0
    29.     szUser32 db 'user32',0
    30. .code
    31. CBTProc proc uses ebx edi esi,nCode:DWORD,wParam:DWORD,lParam:DWORD
    32.     xor eax,eax
    33.     cmp nCode,eax
    34.     jge @f
    35.         push lParam
    36.         push wParam
    37.         push nCode
    38.         push eax
    39.     call _imp__CallNextHookEx@16
    40.     jmp @e
    41. @@: cmp nCode,HCBT_ACTIVATE
    42.     jne @e
    43.         push IDOK
    44.         push wParam
    45.     call _imp__GetDlgItem@8
    46.         push offset bufButton
    47.         push eax
    48.     call _imp__SetWindowTextA@8
    49.         push FALSE
    50.         push wParam
    51.     call _imp__GetSystemMenu@8
    52.         push MF_BYCOMMAND
    53.         push SC_CLOSE
    54.         push eax
    55.     call _imp__DeleteMenu@12
    56.     push wParam
    57.     pop hWnd
    58.     call toTop
    59.         push hHook
    60.     call _imp__UnhookWindowsHookEx@4
    61. @e: ret
    62. CBTProc endp
    63. DigitToChar proc
    64.     mov al,count
    65.     mov edx,offset bufText
    66.     xor ecx,ecx
    67. @@: cmp al,10
    68.     jb @f
    69.     inc cl
    70.     sub al,10
    71.     jmp @b
    72. @@: jecxz @f
    73.     add cl,48
    74.     mov byte ptr [edx],cl
    75. @@: inc edx
    76.     add al,48
    77.     mov byte ptr [edx],al
    78.     xor eax,eax
    79.     jecxz @f
    80.     inc eax
    81. @@: ret
    82. DigitToChar endp
    83. TimerProc proc uses edi esi,hwnd:DWORD,uMsg:DWORD,idEvent:DWORD,dwTime:DWORD
    84.     dec count
    85.     cmp count,-1
    86.     jz @f
    87.     mov edi,offset bufText+1
    88.     call DigitToChar
    89.     sub edi,eax
    90.         push edi
    91.         push hWnd
    92.     call _imp__SetWindowTextA@8
    93.         push 65535
    94.         push hWnd
    95.     call _imp__GetDlgItem@8
    96.         push edi
    97.         push eax
    98.     call _imp__SetWindowTextA@8
    99.     call toTop
    100.     jmp @e
    101. @@:  push eax
    102.         push eax
    103.         push WM_CLOSE
    104.         push hWnd
    105.     call _imp__PostMessageA@16
    106. @e: ret
    107. TimerProc endp
    108. toTop proc uses edi esi
    109.     call _imp__GetForegroundWindow@0
    110.         push NULL
    111.         push eax
    112.     call _imp__GetWindowThreadProcessId@8
    113.     mov esi,eax
    114.         push NULL
    115.         push hWnd
    116.     call _imp__GetWindowThreadProcessId@8
    117.     mov edi,eax
    118.         push TRUE
    119.         push esi
    120.         push eax
    121.     call _imp__AttachThreadInput@12
    122.         push hWnd
    123.     call _imp__SetForegroundWindow@4
    124.         push FALSE
    125.         push esi
    126.         push edi
    127.     call _imp__AttachThreadInput@12
    128.     ret
    129. toTop endp
    130. start:
    131.     xchg ebx,eax
    132.     cmp count,59
    133.     jbe @f
    134.     mov count,59
    135. @@:  push offset szUser32
    136.     call _imp__LoadLibraryA@4
    137.                 push eax
    138.         push sizeof bufButton
    139.         push offset bufButton
    140.         push 802
    141.         push eax
    142.     call _imp__LoadStringA@16
    143.             call _imp__FreeLibrary@4
    144.         push offset szShell32
    145.     call _imp__LoadLibraryA@4
    146.                 push eax
    147.     mov edi,offset bufText
    148.         push sizeof bufText
    149.         push edi
    150.         push 17243
    151.         push eax
    152.     call _imp__LoadStringA@16
    153.             call _imp__FreeLibrary@4
    154.     inc edi
    155.     call DigitToChar
    156.     sub edi,eax
    157.     call _imp__GetCurrentThreadId@0
    158.         push eax
    159.         push ebx
    160.         push offset CBTProc
    161.         push WH_CBT
    162.     call _imp__SetWindowsHookExA@16
    163.     mov hHook,eax
    164.         push offset TimerProc
    165.         push 1000
    166.         push ebx
    167.         push ebx
    168.     call _imp__SetTimer@16
    169.                 push eax
    170.         push MB_OK or MB_ICONSTOP or MB_SYSTEMMODAL
    171.         push edi
    172.         push edi
    173.         push ebx
    174.     call _imp__MessageBoxA@16
    175.                 push ebx
    176.             call _imp__KillTimer@8
    177.     ret
    178. end start
    Если после запуска нажимать только на клавишу 'ввод', то окно никак не реагирует.
    Как окну передать клавиатурный фокус?