我一直致力于一项计划,以保留多个项目的时间。我一直在使用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复制并粘贴了一个我也无法工作的例子。与上述问题相同。
我已经包含了正确的库,并包含了正确的文件,并且它编译得非常好。
感谢您的时间。
答案 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
的引用传递给不会导致访问异常的函数。