📄 nettime.cpp
字号:
// NetTime.cpp : Defines the entry point for the application.
//
#include "stdafx.h"
#include "resource.h"
#pragma comment(lib, "ws2_32.lib")
BOOL CALLBACK MainProc(HWND,UINT,WPARAM,LPARAM);
int ShowPopupMenu(HWND,UINT,WPARAM,LPARAM);
WNDPROC EditProc;
int EditWndProc(HWND,UINT,WPARAM,LPARAM);
BOOL AboutProc(HWND,UINT,WPARAM,LPARAM);
void EditPrintf(HWND,TCHAR*,...);
int FormatulTime(UINT,SYSTEMTIME&);
static HINSTANCE hInst;
static int iTmp=0;
static HWND hMain;
#define WM_NETTIMER (WM_USER+1)
#define ID_TIMER 1
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// TODO: Place code here.
hInst=hInstance;
DialogBox(hInstance,MAKEINTRESOURCE(IDD_DIALOG_MAIN),NULL,(DLGPROC)MainProc);
return 0;
}
BOOL CALLBACK MainProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
static char szIPAddr[]={"129.6.15.28"};
static HWND hwndButton,hwndEdit;
static SOCKET sock;
static struct sockaddr_in sa;
static TCHAR szOKLabel[32];
hMain=hwnd;
int iError,SOCK_ERROR;
unsigned long ulTime;
WORD wEvent,wError;
WSADATA WSAData;
switch (msg)
{
case WM_INITDIALOG:
hwndButton=GetDlgItem(hwnd,IDOK);
hwndEdit=GetDlgItem(hwnd,IDC_EDIT_INFO);
HICON hIcon;
hIcon=LoadIcon(hInst,MAKEINTRESOURCE(IDI_ICON_CLOCK));
SetClassLong(hwnd,GCL_HICON,(LONG)hIcon);
RECT rTmp;
GetClientRect(hwnd,&rTmp);
SetWindowPos(hwnd,NULL,GetSystemMetrics(SM_CXSCREEN)/2-(rTmp.right-rTmp.left)/2,
GetSystemMetrics(SM_CYSCREEN)/2-(rTmp.bottom-rTmp.top)/2,0,0,SWP_NOSIZE);
EditProc=(WNDPROC)SetWindowLong(hwndEdit,GWL_WNDPROC,(LONG)EditWndProc);
return 1;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case ID_MENU_QUIT:
EndDialog(hwnd,0);
return TRUE;
case ID_MENU_ABOUT:
DialogBox(hInst,MAKEINTRESOURCE(IDD_DIALOG_ABOUT),hwnd,(DLGPROC)AboutProc);
return TRUE;
case IDOK:
case IDC_BUTTON_SET:
if(LOWORD(wParam)==IDC_BUTTON_SET)
iTmp=2;
if(LOWORD(wParam)==IDOK)
iTmp=1;
if(iError=WSAStartup(MAKEWORD(2,2),&WSAData))
{
EditPrintf(hwndEdit,"未能正确载入Socket模块#%i。\r\n",iError);
WSACleanup();
return TRUE;
}
sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(sock==INVALID_SOCKET)
{
EditPrintf(hwnd,"创建Socket失败#%i\r\n",WSAGetLastError());
WSACleanup();
return TRUE;
}
if(SOCK_ERROR=WSAAsyncSelect(sock,hwnd,WM_NETTIMER,FD_CONNECT|FD_READ))
{
EditPrintf(hwndEdit,"非阻塞化失败#%i\r\n",WSAGetLastError());
closesocket(sock);
WSACleanup();
return TRUE;
}
sa.sin_addr.S_un.S_addr=inet_addr(szIPAddr);
sa.sin_port=htons(37);
sa.sin_family=AF_INET;
//bind(sock,(SOCKADDR*)&sa,sizeof(sa));
connect(sock,(SOCKADDR *)&sa,sizeof(sa));
if(WSAEWOULDBLOCK!=(iError=WSAGetLastError()))
{
EditPrintf(hwndEdit,"连接错误#%i\r\n",iError);
closesocket(sock);
WSACleanup();
return TRUE;
}
if(LOWORD(wParam)==IDOK)
EditPrintf(hwndEdit,"正在连接NIST Network Time Service\r\n");
return 1;
}
return 0;
case WM_NETTIMER:
wEvent=WSAGETSELECTEVENT(lParam);
wError=WSAGETSELECTERROR(lParam);
switch(wEvent)
{
case FD_CONNECT:
if(wError)
{
EditPrintf (hwndEdit, TEXT ("连 接error #%i.\r\n"), wError) ;
return TRUE ;
}
iError=recv(sock,(char*)&ulTime,4,MSG_PEEK);
return TRUE;
case FD_READ:
if(wError)
{
EditPrintf (hwndEdit, TEXT ("读 数 据error #%i.\r\n"), wError) ;
return TRUE ;
}
iError=recv(sock,(char*)&ulTime,4,0);
if(iError==SOCKET_ERROR)
{
EditPrintf (hwndEdit, TEXT ("读数据error #%i.\r\n"), WSAGetLastError()) ;
return TRUE ;
}
ulTime=ntohl(ulTime);
SYSTEMTIME stTime;
FormatulTime(ulTime,stTime);
if(iTmp==1)
EditPrintf(hwndEdit,"NIST时间“%i-%i-%i %i:%i:%i”\r\n",stTime.wYear,stTime.wMonth,stTime.wDay,stTime.wHour,stTime.wMinute,stTime.wSecond);
if(iTmp==2)
{
SetSystemTime(&stTime);
EditPrintf(hwndEdit,"根据NIST的标准校正了本计算机的时间\r\n");
}
return TRUE;
}
return TRUE;
case WM_RBUTTONDOWN:
ShowPopupMenu(hwnd,msg,wParam,lParam);
return TRUE;
case WM_CLOSE:
closesocket(sock);
WSACleanup();
EndDialog(hwnd,0);
return 1;
}
return 0;
}
void EditPrintf(HWND hwnd,TCHAR * szInfo,...)
{
TCHAR szBuffer[1024];
va_list pArgList;
va_start(pArgList,szInfo);
wvsprintf(szBuffer,szInfo,pArgList);
va_end(pArgList);
SendMessage(hwnd,EM_SETSEL,(WPARAM)-1,(LPARAM)-1);
SendMessage(hwnd,EM_REPLACESEL,FALSE,(LPARAM)szBuffer);
SendMessage(hwnd,EM_SCROLLCARET,0,0);
}
int FormatulTime(UINT ulTime,SYSTEMTIME &stTime)
{
FILETIME ftNew;
LARGE_INTEGER li;
SYSTEMTIME stNew;
stNew.wYear=1900;
stNew.wMonth=1;
stNew.wDay=1;
if(iTmp==1)
{
stNew.wHour=8;
}
if(iTmp==2)
{
stNew.wHour=0;
}
stNew.wMinute=0;
stNew.wSecond=0;
stNew.wMilliseconds=0;
SystemTimeToFileTime(&stNew,&ftNew);
li=*(LARGE_INTEGER*)&ftNew;
li.QuadPart+=(LONGLONG)10000000*ulTime;
ftNew=*(FILETIME*)&li;
FileTimeToSystemTime(&ftNew,&stTime);
return 1;
}
int ShowPopupMenu(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
POINT pt;
GetCursorPos(&pt);
HMENU hMenuPopup,hMenu;
hMenu=LoadMenu(hInst,MAKEINTRESOURCE(IDR_MENU_MAIN));
hMenuPopup=CreatePopupMenu();
hMenuPopup=GetSubMenu(hMenu,0);
TrackPopupMenu(hMenuPopup,0,pt.x,pt.y,0,hMain,0);
DestroyMenu(hMenu);
DestroyMenu(hMenuPopup);
return TRUE;
}
int EditWndProc(HWND hwnd ,UINT msg,WPARAM wParam,LPARAM lParam)
{
switch(msg)
{
case WM_RBUTTONDOWN:
ShowPopupMenu(hwnd,msg,wParam,lParam);
return TRUE;
}
return CallWindowProc(EditProc,hwnd,msg,wParam,lParam);
}
BOOL AboutProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
switch(msg)
{
case WM_CLOSE:
EndDialog(hwnd,0);
return TRUE;
case WM_COMMAND:
switch(wParam)
{
case IDOK:
EndDialog(hwnd,0);
return TRUE;
}
return FALSE;
}
return FALSE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -