win32 ——定时器消息 小程序:打印时间
//定时器消息 //设置了定时器之后,操作系统每隔一段相同的时间就产生WM_TIMER消息 //原型 UINT_PTR SetTimer( HWND hWnd, //窗口句柄 UINT_PTR nIDEvent, //定时器id UINT uElapse, // 每隔多长时间 TIMERPROC lpTimerFunc); //处理函数 //一、winproc中case WM_TIMER:处理 SetTimer(hwnd, 1, 1000, NULL);//显示更新窗口之后, 消息循环之前 //二、自定义timeproc中处理 SetTimer(hwnd, 1, 1000, timeproc);//显示更新窗口之后, 消息循环之前 //最后都要在while()结束时 KillTimer(hwnd, 1); //对应ID号 //===========================小程序:打印时间=========================
//My Projecr
#include<windows.h> #include<tchar.h> HANDLE g_h; void CALLBACK timeProc(HWND hWnd, UINT id, UINT_PTR xxx, DWORD ooo) { // //获取系统的UTC时间。 // // SYSTEMTIME stUTC; // // ::GetSystemTime(&stUTC); // // // //显示时间的间隔。 // // const int nBufSize = 256; // // TCHAR chBuf[nBufSize]; // // wsprintf(chBuf, _T("UTC: %u/%u/%u %u:%u:%u:%u %d\r\n"), // // stUTC.wYear, stUTC.wMonth, stUTC.wDay, // // stUTC.wHour, stUTC.wMinute, stUTC.wSecond, // // stUTC.wMilliseconds, stUTC.wDayOfWeek); // // WriteConsole(g_h, chBuf, _tcslen(chBuf), NULL, NULL); // //获取当地的时间。 SYSTEMTIME stLocal; ::GetLocalTime(&stLocal); //显示时间的间隔。 const int nBufSize = 256; TCHAR chBuf[nBufSize]; //显示时间的间隔。 wsprintf(chBuf, _T(" %02d:%02d:%02d\n"),stLocal.wHour, stLocal.wMinute, stLocal.wSecond); WriteConsole(g_h, chBuf, _tcslen(chBuf), NULL, NULL); } TCHAR ClassName[100] = _T("潭州"); LRESULT CALLBACK winProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { switch (msg) { case WM_DESTROY: PostQuitMessage(0); break; /*case WM_TIMER: WriteConsole();*/ default: break; } return DefWindowProc(hWnd, msg, wp, lp); } int WinMain(HINSTANCE hIns, HINSTANCE hPIns, LPSTR lpCmd, int show) { WNDCLASS wc; wc.hInstance = hIns; wc.lpfnWndProc = winProc; wc.hCursor = NULL; wc.hIcon = NULL; wc.style = NULL; wc.hbrBackground = NULL; wc.lpszMenuName = NULL; wc.lpszClassName = ClassName; wc.cbClsExtra = NULL; wc.cbWndExtra = NULL; //register ATOM res = RegisterClass(&wc); if (!res) { MessageBox(NULL, _T("注册失败"), ClassName, MB_OK); return 0; } //create HWND hWnd = CreateWindow(ClassName, _T("hello world"), WS_OVERLAPPEDWINDOW, 520, 100, 520, 520, NULL, NULL, hIns, NULL); if (!hWnd) { MessageBox(NULL, _T("创建失败"), ClassName, MB_OK); return -1; } //show ShowWindow(hWnd, SW_SHOW); //update UpdateWindow(hWnd); //定时器 SetTimer(hWnd, 1, 1000, timeProc); //SetTimer(hWnd, 2, 1000, NULL); //message circle MSG msg = { 0 }; //分配一个控制台 AllocConsole(); //获取句柄 标准输出句柄 g_h = GetStdHandle(STD_OUTPUT_HANDLE); //写入到屏幕 WriteConsole(g_h, _T("时间\n"), _tcslen(_T("时间\n")), NULL, NULL); //PeekMesssge只得到那些与参数hWnd标识的窗口相联系的消息或被lsChild确定为其子窗口相联系的消息, //并且该消息要在由参数wMsgFiterMin和wMsgFiherMax确定的范围内。 //如果hWnd为NULL,则PeekMessage接收属于当前调用线程的窗口的消息(PeekMessage不接收属于其他线程的窗口的消息)。 //如果hWnd为 - 1,PeekMessage只返回hWnd值为NULL的消息,该消息由函数PostThreadMessage寄送。 //如果wMsgFilterMin和wMsgFilterMax都为零,PeekMessage返回所有可得的消息(即,无范围过滤)。 while (1) { if (PeekMessage(&msg, NULL, 0,0,PM_NOREMOVE)) { if (!GetMessage(&msg, NULL, 0, 0)) { break; } else { TranslateMessage(&msg); DispatchMessage(&msg); } } else { } } KillTimer(hWnd, 1); return 0; }
靠技术实力称霸,千面鬼手大人万岁!