Win32 C ++使用多媒体计时器

时间:2013-09-24 21:54:06

标签: c++ winapi timer

我一直致力于一项计划,以保留多个项目的时间。我一直在使用WM_TIMER,最近发现它正在运行

太慢了。所以我一直试图让多媒体计时器工作。

问题是它会部分地显示一些窗口,留下我的所有者绘制控件所在的透明矩形。在

同时,我收到一个错误:该程序已退出工作。

从我在网上找到的例子中,几乎发生了同样的事情。

全球范围内我有这个变量:

PHANDLE ptrTimerHandle;

MSDN,如果我读得正确,说你可以重命名回调函数。

VOID CALLBACK TimerCallback(PVOID lpParameter, BOOLEAN TimerOrWaitFired);

以下是我尝试在WinMain中设置计时器的方法(直到启动时为500毫秒,并且每200毫秒计时):

CreateTimerQueueTimer(ptrTimerHandle, NULL, TimerCallback, 0, 500, 200, WT_EXECUTEDEFAULT | WT_EXECUTEINTIMERTHREAD);

然后是函数,那是空的,但我做了测试,没有发送任何东西。

VOID CALLBACK TimerCallback(PVOID lpParameter, BOOLEAN TimerOrWaitFired) {}

在尝试这样做之前,我从MSDN复制并粘贴了一个我也无法工作的例子。与上述问题相同。

我已经包含了正确的库,并包含了正确的文件,并且它编译得非常好。

感谢您的时间。

1 个答案:

答案 0 :(得分:3)

尝试执行以下操作(或之后,我忘了),包括windows.h

#define  _WIN32_WINNT 0x0601 // value for windows 7

由于除非此值大于0x0500,否则队列计时器不起作用。在视觉工作室因某种原因决定我没有在Windows 7上运行之前,我已经发生过这种情况。

这是Page that tells you about this in remarks
这是documentation for windows versions


以下代码适用于我:

#include <Windows.h>
#include <stdio.h>

void __stdcall 
TimerCallback(PVOID lpParameter, BOOLEAN TimerOrWaitFired)
{
    printf("Hello World\n");
}

int
main(int argc, char* argv[]) {
    HANDLE ptrTimerHandle;
    CreateTimerQueueTimer(&ptrTimerHandle, NULL, TimerCallback, NULL, 500, 200, WT_EXECUTEDEFAULT );

    getchar();

    DeleteTimerQueueTimer(NULL, ptrTimerHandle, NULL);
    return 0;
}

我怀疑您的程序无法正常工作的原因是因为您使用的是PHANDLE而不是HANDLE。 哪个会为您提供访问权限,因为您从未初始化PHANDLE以保留HANDLE 如果您注意到,我使用HANDLE,然后将对HANDLE的引用传递给不会导致访问异常的函数。