- 如果处理时间大于定时器时间,按照处理时间循环。
- 如果处理时间小于定时器时间,按照定时器时间。
#pragma comment(lib,"user32")
#include <stdio.h>
#include <time.h>
#include <sys/timeb.h>
#include <windows.h>
char datestr[16];
char timestr[16];
char mss[4];
void log(char *s) {
struct tm *now;
struct timeb tb;
ftime(&tb);
now = localtime(&tb.time);
sprintf(datestr, "%04d-%02d-%02d", now->tm_year + 1900, now->tm_mon + 1, now->tm_mday);
sprintf(timestr, "%02d:%02d:%02d", now->tm_hour, now->tm_min, now->tm_sec);
sprintf(mss, "%03d", tb.millitm);
printf("%s %s.%s %s", datestr, timestr, mss, s);
VOID CALLBACK myTimerProc1(
HWND hwnd,
UINT uMsg,
UINT idEvent,
DWORD dwTime
log("In myTimerProc1\n");
VOID CALLBACK myTimerProc2(
HWND hwnd,
UINT uMsg,
UINT idEvent,
DWORD dwTime
log("In myTimerProc2\n");
int main()
MSG msg;
SetTimer(NULL, 0, 4000, myTimerProc1);
SetTimer(NULL, 1, 2000, myTimerProc2);
for (int i = 0; i<20; i++)
Sleep(1000);
log("In main\n");
if (GetMessage(&msg, NULL, 0, 0))
TranslateMessage(&msg);
DispatchMessage(&msg);
return 0;
2019-12-06 21:10:24.633 In main
2019-12-06 21:10:25.618 In myTimerProc2
2019-12-06 21:10:26.619 In main
2019-12-06 21:10:27.620 In myTimerProc1
2019-12-06 21:10:28.621 In main
2019-12-06 21:10:28.621 In myTimerProc2
2019-12-06 21:10:29.623 In main
2019-12-06 21:10:29.624 In myTimerProc2
2019-12-06 21:10:30.625 In main
2019-12-06 21:10:31.623 In myTimerProc1
2019-12-06 21:10:32.624 In main
2019-12-06 21:10:32.624 In myTimerProc2
2019-12-06 21:10:33.626 In main
2019-12-06 21:10:33.626 In myTimerProc2
2019-12-06 21:10:34.628 In main
TranslateMessage是用来把虚拟键消息转换为字符消息。由于Windows对所有键盘编码都是采用虚拟键的定义,这样当按键按下时,并不得字符消息,需要键盘映射转换为字符的消息。
TranslateMessage函数用于将虚拟键消息转换为字符消息。字符消息被投递到调用线程的消息队列中,当下一次调用GetMessage函数时被取出。当我们敲击键盘上的某个字符键时,系统将产生WM_K...
继注册窗体类、创建窗体往下讲。我们用Visual Studio创建一个win32项目上会自动生成一个消息处理函数。如下://
// 函数: WndProc(HWND, UINT, WPARAM, LPARAM)
// 目的: 处理主窗口的消息。
// WM_COMMAND - 处理应用程序菜单
// WM_PAINT - 绘制主窗口
// WM_DESTROY - 发送退出...
函数功能:TranslateMessage 函数将虚拟键消息转换为字符消息,字符消息被寄送到当前线程的消息队列里。当下一次线程调用函数 GetMessage 或 PeekMessage 时被读出。
API 函数原型:BOOL WINAPI TranslateMessage(
_In_ const MSG *lpMsg
);复制代码
参数解析: 参数 含义 lpMsg 指向含有消息的 MSG 结
此函数从调用线程的
消息队列中取出一个
消息。此函数发送
消息队列的
消息直到这个
消息适合检索。然后把检索到的
消息赋值给MSG结构体。
PeektMessage函数和
GetMessage不同,PeekMessage不会等待一个
消息发送到
消息队列时才返回。
BOOL
GetMessage(
LPMSGlpMsg, // message information
TranslateMessage(&msg);
TranslateMessage是用来把快捷键消息转换为字符消息,并将转换后的新消息投递到调用线程的消息队列中。
由于Windows对所有键盘编码都是采用虚拟键的定义,这样当按键按下时,并不得字符消息,需要键盘映射转换为字符的消息。字符消息被投递到调用线程的消息队列中,当下一次调用GetMessage函数时被取出。当我们敲击键盘上的某个字符键时,系统将产生WM_KEYDOWN和WM_KEYUP消息。这两个消息的附加参数( wParam和 lParam)
GetMessage
GetMessage是计算机编程中的一个函数,从调用线程的消息队列里取得一个消息并把其放于指定的结构。GetMessage函数可取得与指定窗口联系的消息和由PostThreadMesssge寄送的线程消息,接收一定范围的消息值,不接收属于其他线程或应用程序的消息。GetMessage获取消息成功后,线程把从消息队列中删除该消息,函数会一直等待直到有消息到来才有返回值。
WINUSERAPI
WINAPI
GetMessage(
_Out_ LPMS