2

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が選択する代わりに、自分でタイマーを管理することはできますか?

どうもありがとうございます!

4

3 に答える 3

8

1つのルーチンで複数のタイマーイベントを処理する場合は、特定のルーチンではなく、特定のウィンドウで処理します。

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;
于 2012-12-27T07:15:43.047 に答える
5

SetTimerは、ウィンドウハンドルを渡すかどうかによって、動作が異なります。

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

上記の例では、Timer_IdentifierはMyIdentifierと等しくありません。

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

2番目の例では、Timer_Identifier=MyIdentifierです。

これは、2番目の例では、Windowsループが「MyIdentifier」を使用して、どのタイマーが「WM_Timer」メッセージを送信しているかを確認する必要があるためです。

ウィンドウハンドルなしで特定のタイマー関数を使用することは異なります。簡単に言うと、シナリオでは、Windowsが提供する値を使用します。

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

于 2012-12-27T06:47:08.537 に答える
0

マルチメディアタイマーは私の問題を解決しました!

私は彼らに私が望むものは何でも渡すことができますdwUser:)

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

MSDNから:dwUser->ユーザー提供のコールバックデータ。

  • 彼らTIME_ONESHOTはまさに私がタイマーを使うものであるオプションを持っています!
于 2012-12-27T07:11:28.310 に答える