今天犯了一个粗心的错误,在无窗口线程中,SetTimer中设置计时器ID,而WM_TIMER消息响应函数中得到的计时器ID却不是之前设置的计时器ID.
// 111902.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "windows.h"
BOOL DispatchThreadMessage(MSG* pMsg);
VOID CALLBACK OnTimerProc(HWND hwnd,UINT uMsg,UINT_PTR idEvent,DWORD dwTime);
int main(int argc, char* argv[])
{
printf("Hello World!/n");
::SetTimer(NULL,1,1000,OnTimerProc);
MSG msg;
while (GetMessage(&msg, 0, 0, 0) > 0)
{
if (msg.hwnd == NULL && DispatchThreadMessage(&msg))
continue;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
BOOL DispatchThreadMessage(MSG* pMsg)
{
if(pMsg->message == 0x0113)
{
printf("DispatchThreadMessage: %6d/n",pMsg->wParam);
return false;
}
return false;
}
VOID CALLBACK OnTimerProc(HWND hwnd,UINT uMsg,UINT_PTR idEvent,DWORD dwTime)
{
printf("OnTimerProc: %6d/n",idEvent);
}
对应计时器ID的输出的是一个随机数字.
原来在msdn中
nIDEvent [in] Specifies a nonzero timer identifier. If the hWnd parameter is NULL, and the nIDEvent does not match an existing timer then it is ignored and a new timer ID is generated. If the hWnd parameter is not NULL and the window specified by hWnd already has a timer with the value nIDEvent , then the existing timer is replaced by the new timer. When SetTimer replaces a timer, the timer is reset. Therefore, a message will be sent after the current time-out value elapses, but the previously set time-out value is ignored. If the call is not intended to replace an existing timer, nIDEvent should be 0 if the hWnd is NULL. 注:只有当hWnd参数为非空时,计时器的ID为设置的 nIDEvent, 系统为你自动生成一个计时器ID,可由返回时值获取.
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有