SetTimer生成一个随机的IDEvent

时间:2012-12-27 06:09:29

标签: windows delphi api timer

当我尝试使用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;

返回:

随机数!

是否可以自己管理我的计时器而不是Windows为我选择?

非常感谢!

3 个答案:

答案 0 :(得分:8)

如果要在单个例程中处理多个计时器事件,请按特定窗口处理,而不是按特定例程处理:

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;

答案 1 :(得分:5)

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

答案 2 :(得分:0)

多媒体计时器解决了我的问题!

我可以通过dwUser传递任何我想要的东西:)

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

来自MSDN:dwUser - >用户提供的回调数据。

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