SetTimer生成一个随机的IDEvent

当我尝试使用Windows SetTimer函数时,即使指定了一个 ,它也会为计时器生成一个IDEvent

这个:

SetTimer(0,999,10000,@timerproc); 

在:

 procedure timerproc(hwnd: HWND; uMsg: UINT; idEvent: UINT_PTR;dwTime: DWORD); stdcall; begin KillTimer(0, idEvent); showmessage(inttostr(idevent)); end; 

返回:

随机数字!

是否可以自己pipe理我的计时器,而不是Windows为我select?

非常感谢你!

Solutions Collecting From Web of "SetTimer生成一个随机的IDEvent"

如果你想在一个例程中处理多个定时器事件,那么通过特定的窗口而不是特定的例程来处理:

 type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private FTimerWindow: HWND; procedure TimerProc(var Msg: TMessage); end; ... procedure TForm1.FormCreate(Sender: TObject); begin FTimerWindow := Classes.AllocateHWnd(TimerProc); SetTimer(FTimerWindow, 999, 10000, nil); end; procedure TForm1.FormDestroy(Sender: TObject); begin Classes.DeallocateHWnd(FTimerWindow); end; procedure TForm1.TimerProc(var Msg: TMessage); begin if Msg.Msg = WM_TIMER then with TWMTimer(Msg) do case TimerID of 999: // else: // end; end; 

SetTimer将以不同的方式工作,这取决于你是否传递一个窗口句柄。

 Timer_Indentifier := SetTimer(0, MyIdentifier, Time, @myproc); 

在上面的例子中,Timer_Identifier不等于MyIdentifier。

 Timer_Indentifier := SetTimer(handle, MyIdentifier, Time, @myproc); 

在第二个例子中,Timer_Identifier = MyIdentifier。

这是因为在第二个例子中,你的Windows循环将需要使用“MyIdentifier”来找出哪个定时器发送一个“WM_Timer”消息给它。

使用不带窗口句柄的特定定时器功能是不同的。 简短的回答是在你的情况下,使用Windows给你的值。

http://msdn.microsoft.com/en-us/library/windows/desktop/ms644906%28v=vs.85%29.aspx

多媒体Timer解决了我的问题!

我可以通过任何我想要他们与dwUser 🙂

 MMRESULT timeSetEvent( UINT uDelay, UINT uResolution, LPTIMECALLBACK lpTimeProc, DWORD_PTR dwUser, UINT fuEvent ); 

从MSDN:dwUser – >用户提供的回调数据。

  • 他们有一个TIME_ONESHOT选项,这正是我使用定时器的!