我正在使用Windows API编写C ++代码。
如果我想在没有提供GUI的程序中使用SetTimer
及其朋友,我知道我可以使用SetTimer(NULL, 1, 2000, Timerflow)
,而NULL
是hWnd
}参数。
如何编写处理,启动和终止计时器的代码?
答案 0 :(得分:5)
查看CreateWaitableTimer()
,SetWaitableTimer()
和WaitForSingleObject()
。无需回调或消息处理。请参阅MSDN's example。
答案 1 :(得分:3)
您可以直接使用Win32 API使用SetTimer()
函数,而无需使用任何包装类(MFC等)。
请记住,Windows计时器使用GUI事件循环。如果您不使用GetMessage()
或PeekMessage()
函数处理事件,则在计时器结束时不会收到通知。您还需要创建一个定时器将附加到的窗口(WM_TIMER
消息将在该窗口的window procedure中报告。
查看GetMessage()
的文档,了解如何编写事件循环。另请查看“Creating a Timer”,了解如何处理WM_TIMER
消息。
RegisterClass()
功能注册结构。CreateWindow()
功能创建刚刚注册的类的窗口。GetMessage()
函数处理邮件。该循环中的DispatchMessage()
调用会将WM_TIMER
个事件转发到您的窗口过程,您可以从那里处理该消息。第1步,第2步和第3步应该是WinMain()
功能的一部分。以下是关键步骤的概述(故意不完整,检查文档以了解如何处理错误和清理):
LRESULT __stdcall MyWindowProcedure
( HWND window, UINT message, WPARAM wparam, LPARAM lparam )
{
if (message == WM_TIMER) {
// timer elapsed.
}
return DefWindowProc(window, message, wparam, lparam);
}
int __stdcall WinMain ( HINSTANCE application, HINSTANCE, LPSTR, int )
{
::WNDCLASS klass;
// ...
klass.lpfnWndProc = &MyWindowProcedure;
RegisterClass(&klass);
// ...
HWND window = CreateWindow(klass.lpszClassName, ...);
// ...
const DWORD SECOND = 1000;
const DWORD MINUTE = 60 * SECOND;
UINT_PTR timer = SetTimer(window, 0, 2*MINUTE, 0);
// ...
MSG message;
while (GetMessage(&message, window, 0, 0) > 0)
{
TranslateMessage(&message);
DispatchMessage(&message);
}
// ...
}