win32 下,获得系统时间,精确到毫秒

win32 下,获得系统时间,精确到毫秒

#include <WINBASE.H>

SYSTEMTIME now;
GetLocalTime(&now);
printf("<%d-%d-%d %d:%d:%d:%d> \n", 
now.wYear, now.wMonth, now.wDay, 
now.wHour, now.wMinute, now.wSecond, now.wMilliseconds);


下面是一个Win32汇编秒表程序,使用了Windows API中的计时器函数来实现毫秒级的计时和显示: ``` .386 .model flat, stdcall option casemap:none include \masm32\include\windows.inc include \masm32\include\user32.inc includelib \masm32\lib\user32.lib include \masm32\include\kernel32.inc includelib \masm32\lib\kernel32.lib .data msg db 'Time:',13,10,0 count dd 0 tick dd 0 hWnd dd 0 .code start: ; 创建窗口 invoke GetModuleHandle, NULL mov hInstance, eax invoke WinMain, hInstance, NULL, NULL, SW_SHOWDEFAULT invoke ExitProcess, eax WinMain proc hInst:HINSTANCE, hPrevInst:HINSTANCE, lpCmdLine:LPSTR, nCmdShow:DWORD mov eax, hInst mov hInstance, eax ; 注册窗口类 mov wc.cbSize, SIZEOF WNDCLASSEX mov wc.style, CS_HREDRAW or CS_VREDRAW mov wc.lpfnWndProc, offset WndProc mov wc.cbClsExtra, 0 mov wc.cbWndExtra, 0 push hInstance pop wc.hInstance mov wc.hbrBackground, COLOR_WINDOW+1 mov wc.lpszMenuName, NULL mov wc.lpszClassName, offset szClassName push IDI_APPLICATION push NULL call LoadIcon mov wc.hIcon, eax mov wc.hIconSm, eax push IDI_APPLICATION push NULL call LoadCursor mov wc.hCursor, eax invoke RegisterClassEx, addr wc ; 创建窗口 invoke CreateWindowEx, WS_EX_CLIENTEDGE, offset szClassName, offset szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 320, 240, NULL, NULL, hInstance, NULL mov hWnd, eax invoke ShowWindow, hWnd, SW_SHOW invoke UpdateWindow, hWnd ; 设置计时器 invoke SetTimer, hWnd, 1, 1, NULL ; 消息循环 msgloop: invoke GetMessage, ADDR msg, NULL, 0, 0 cmp eax, 0 je quit invoke TranslateMessage, ADDR msg invoke DispatchMessage, ADDR msg jmp msgloop quit: invoke KillTimer, hWnd, 1 invoke DestroyWindow, hWnd invoke UnregisterClass, offset szClassName, hInstance mov eax, msg.wParam ret WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM cmp uMsg, WM_CREATE je wmcreate cmp uMsg, WM_TIMER je wmtimer cmp uMsg, WM_PAINT je wmpaint cmp uMsg, WM_DESTROY je wmdestroy jmp defwndproc wmcreate: mov eax, 0 ret wmtimer: ; 获取当前时间 invoke GetTickCount mov tick, eax ; 计算时间差 sub eax, count mov count, tick ; 更新窗口 invoke InvalidateRect, hWnd, NULL, TRUE invoke UpdateWindow, hWnd ret wmpaint: ; 绘制文本 invoke BeginPaint, hWnd, ADDR ps invoke GetClientRect, hWnd, ADDR rect invoke SetTextColor, ps.hdc, 0000FFh invoke SetBkMode, ps.hdc, TRANSPARENT invoke TextOut, ps.hdc, 10, 10, ADDR msg, sizeof msg - 1 invoke wsprintf, ADDR buf, '%d.%03d', count / 1000, count % 1000 invoke TextOut, ps.hdc, 60, 10, ADDR buf, eax invoke EndPaint, hWnd, ADDR ps ret wmdestroy: mov eax, 0 jmp quit defwndproc: invoke DefWindowProc, hWnd, uMsg, wParam, lParam ret szClassName db 'MyWindowClass',0 szTitle db 'My Window',0 buf db 16 dup (?) rect RECT <0, 0, 320, 240> wc WNDCLASSEX ? ps PAINTSTRUCT <> hInstance HINSTANCE ? hWnd HWND ? msg MSG <> count dd 0 tick dd 0 end start ``` 该程序创建了一个窗口,通过设置计时器每1毫秒触发一次回调函数来实现计时和显示。在回调函数中,通过调用`GetTickCount`函数获取当前时间,计算时间差,并更新窗口显示。窗口绘制使用了Windows API中的GDI函数。 注意:该程序只是一个简单的示例,实际使用中可能需要更复杂的逻辑来处理计时和显示,同时需要注意计时器的精度和稳定性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值