まったくもって理由はわかりませんが、自作のタイマーコンポーネントがXPで動きません。9x、NT4.0、2kでは普通に動いていたのに。
検索しても情報ゼロです。なんだこれは。
constructor TTimer.Create(AOwner: TComponent); begin inherited; // WM_TIMEを受け取る擬似ウインドを作成(ExCtrlユニット) FWindowHandle := AllocateHWnd(WndProc); end; procedure TTimer.StartTimer; begin _hTimer := SetTimer(FWindowHandle, TimerID, IntervalTime[ord(_Interval)] - adjustTime, nil); if _hTimer = 0 then raise EOutOfResources.Create('タイマーを作成出来ませんでした。'); end; procedure TTimer.StopTimer; begin if _hTimer <> 0 then begin if KillTimer(FWindowHandle, TimerID) then _hTimer := 0 else raise EOutOfResources.Create('タイマー破棄時にエラーが発生しました。'); end; end; procedure TTimer.WndProc(var Msg: TMessage); begin with Msg do begin if Msg = WM_TIMER then begin try Time; except Application.HandleException(Self); end; end else Result := DefWindowProc(FWindowHandle, Msg, wParam, lParam); end; end; procedure TTimer.Time; begin StopTimer; if Enabled then begin if assigned(FOnTime) then FOnTime(self); StartTimer; end; end;
で、SetTimerでは正常にタイマーのハンドルが戻ってきますが、WinProcにWM_TIMERイベントが来ません。なんとも。