[fasm]-date et heure

Contenu du snippet

Tiré du code de x5man, j'en ai fait une version utilisable avec Flat Assembler et les API Windows ;)

Source / Exemple :


format PE GUI 4.0
entry start

include 'win32a.inc'

; *****************************************************************************
; ***** Const
; *****************************************************************************
ID_DIALOG          = 10
ID_GROUP_BOX       = 100

ID_LABEL_DATE      = 101
ID_LABEL_TIME      = 102
ID_LOCAL_TIME      = 103

ID_EDIT_DATE       = 104
ID_EDIT_TIME       = 105
ID_EDIT_LOCAL      = 106

ID_BUTTON_TIME     = 107
ID_BUTTON_QUIT     = 108

; *****************************************************************************
; ***** Datas
; *****************************************************************************
section '.data' data readable writeable

  hinstance        dd ?
  IsError          dd ?
  lpSystemTime     SYSTEMTIME                                   ; API struct

  _format_date     db '%02u/%02u/%4u',0
  _buffer_date     rb 11                                        ; 11 bytes reserved (xx/xx/xxxx0)

  _format_time     db '%02d:%02d:%02d',0
  _buffer_time     rb 9                                         ; 9 bytes reserved (xx:xx:xx0)
  _buffer_loc_time rb 9

; *****************************************************************************
; ***** Code
; *****************************************************************************
section '.code' code readable executable

  start:
        invoke  GetModuleHandle,0
        mov     [hinstance],eax
        invoke  DialogBoxParam,[hinstance],ID_DIALOG,HWND_DESKTOP,DialogProc,0
        invoke  ExitProcess,0

; ***** Procedures

proc DialogProc hwnddlg,msg,wparam,lparam
        push    ebx esi edi
        cmp     [msg],WM_INITDIALOG
        je      wminitdialog                                    ; called before dialog box is displayed
        cmp     [msg],WM_COMMAND
        je      wmcommand
        cmp     [msg],WM_CLOSE
        je      wmclose
        xor     eax,eax                                         ; eax = 0
        jmp     finish

  wminitdialog:
        stdcall sys_time,[hwnddlg]
        stdcall loc_time,[hwnddlg]
        stdcall sys_date,[hwnddlg]

        jmp     processed

  wmcommand:
        cmp     [wparam],ID_BUTTON_QUIT                         ; BN_CLICKED shl 16 + ID_BUTTON_QUIT
        je      wmclose                                         ; goto close if click on Cancel
;        invoke  SendMessage,\
;                ID_BUTTON_QUIT, BM_SETSTATE, TRUE, NULL
        invoke  GetDlgItem,[hwnddlg],ID_BUTTON_QUIT             ; ALWAYS put focus on button 'Quit'
        invoke  SetFocus,eax

        cmp     [wparam],ID_BUTTON_TIME                         ; BN_CLICKED shl 16 + ID_BUTTON_TIME
        jne     processed                                       ; <> Ok
        stdcall sys_time,[hwnddlg]                              ; Called when clicked on button 'Time'
        stdcall loc_time,[hwnddlg]
        jmp     processed

  wmclose:
        invoke  EndDialog,[hwnddlg],0

  processed:
        mov     eax,1

  finish:
        pop     edi esi ebx
        ret
endp

proc sys_time   _hwnddlg
        invoke  GetSystemTime,lpSystemTime
        movsx   eax,[lpSystemTime.wHour]                        ; movsx (ou movzx) permet de
        movsx   ebx,[lpSystemTime.wMinute]                      ; convertir en DWORD signed (ou unsigned)
        movsx   edi,[lpSystemTime.wSecond]                      ; car wsprintf ne demande que du DWORD
        cinvoke wsprintf,_buffer_time,_format_time,eax,ebx,edi
        invoke  SetDlgItemText,[_hwnddlg],ID_EDIT_TIME,_buffer_time

        ret     ;return
endp

proc loc_time   _hwnddlg
        invoke  GetLocalTime,lpSystemTime
        movsx   eax,[lpSystemTime.wHour]
        movsx   ebx,[lpSystemTime.wMinute]
        movsx   edi,[lpSystemTime.wSecond]
        cinvoke wsprintf,_buffer_loc_time,_format_time,eax,ebx,edi
        invoke  SetDlgItemText,[_hwnddlg],ID_EDIT_LOCAL,_buffer_loc_time

        ret
endp

proc sys_date   _hwnddlg
        movzx   eax,[lpSystemTime.wDay]                         ; movzx (unsigned)
        movzx   ebx,[lpSystemTime.wMonth]
        movzx   edi,[lpSystemTime.wYear]
        invoke  wsprintf,_buffer_date,_format_date,eax,ebx,edi  ; using invoke because of unsigned word '%02u/%02u/%4u'
        invoke  SetDlgItemText,[_hwnddlg],ID_EDIT_DATE,_buffer_date

        ret
endp

; *****************************************************************************
; ***** Data Import
; *****************************************************************************
section '.idata' import data readable writeable

  library kernel,'KERNEL32.DLL',\
          user,'USER32.DLL'

  import kernel,\
         GetModuleHandle,'GetModuleHandleA',\
         GetSystemTime, 'GetSystemTime',\
         GetLocalTime, 'GetLocalTime',\
         ExitProcess,'ExitProcess'

  import user,\
         DialogBoxParam,'DialogBoxParamA',\
         UpdateWindow,'UpdateWindow',\
         SendMessage,'SendMessageA',\
         SetDlgItemText,'SetDlgItemTextA',\                     ; on peut aussi mettre SetDlgItemInt
         GetDlgItem,'GetDlgItem',\
         SetFocus,'SetFocus',\
         MessageBox,'MessageBoxA',\
         wsprintf,'wsprintfA',\
         LoadIcon,'LoadIconA',\
         EndDialog,'EndDialog'

; *****************************************************************************
; ***** Resources
; *****************************************************************************
section '.rsrc' resource data readable

  directory RT_DIALOG,dialogs,\
            RT_ICON,rt_icons,\
            RT_GROUP_ICON,rt_group_icons

  resource dialogs,\
           ID_DIALOG,LANG_NEUTRAL+SUBLANG_DEFAULT,datesysteme

  resource rt_icons,\
           200,LANG_NEUTRAL,icon_data
  resource rt_group_icons,\
           201,LANG_NEUTRAL,main_icon

  dialog datesysteme,"System Date & Time by Flaith", 70, 70, 150, 110, DS_CENTER+DS_MODALFRAME+WS_POPUP+WS_VISIBLE+WS_CAPTION+WS_SYSMENU
    dialogitem 'STATIC','System date :', ID_LABEL_DATE , 10, 10, 45, 14, SS_RIGHT + SS_CENTERIMAGE + WS_CHILD + WS_VISIBLE + WS_GROUP, 0x00000000
    dialogitem 'STATIC','System Time :', ID_LABEL_TIME , 10, 30, 45, 14, SS_RIGHT + SS_CENTERIMAGE + WS_CHILD + WS_VISIBLE + WS_GROUP, 0x00000000
    dialogitem 'STATIC','Local Time :' , ID_LOCAL_TIME , 10, 50, 45, 14, SS_RIGHT + SS_CENTERIMAGE + WS_CHILD + WS_VISIBLE + WS_GROUP, 0x00000000
    dialogitem 'BUTTON',''             , ID_GROUP_BOX  , 60,  0, 85, 70, BS_GROUPBOX + WS_CHILD + WS_VISIBLE, 0x00000000
    dialogitem 'STATIC','__/__/____'   , ID_EDIT_DATE  , 70, 10, 65, 14, SS_CENTER + SS_CENTERIMAGE + WS_CHILD + WS_VISIBLE + WS_GROUP, 0x00000204
    dialogitem 'STATIC','__:__:__'     , ID_EDIT_TIME  , 70, 30, 65, 14, SS_CENTER + SS_CENTERIMAGE + WS_CHILD + WS_VISIBLE + WS_GROUP, 0x00000204
    dialogitem 'STATIC','__:__:__'     , ID_EDIT_LOCAL , 70, 50, 65, 14, SS_CENTER + SS_CENTERIMAGE + WS_CHILD + WS_VISIBLE + WS_GROUP, 0x00000204

; button quit defined first (before time) with BS_DEFPUSHBUTTON value to give focus

    dialogitem 'BUTTON','&Quit'        , ID_BUTTON_QUIT, 80, 80, 60, 28, WS_VISIBLE+WS_TABSTOP+BS_DEFPUSHBUTTON ;BS_DEFPUSHBUTTON + BS_VCENTER + BS_CENTER + WS_CHILD + WS_VISIBLE + WS_TABSTOP
    dialogitem 'BUTTON','&Time'        , ID_BUTTON_TIME, 10, 80, 60, 28, WS_VISIBLE+WS_TABSTOP+BS_PUSHBUTTON ;BS_PUSHBUTTON + BS_VCENTER + BS_CENTER + WS_CHILD + WS_VISIBLE + WS_TABSTOP
  enddialog

  icon main_icon,icon_data,'nico.ico'     ; mettez l'icone que vous voulez

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.