システム時刻の変更を通知するWindowProcを作成しました。
constructor TJJWScheduler.Create;
begin
fTimeChangeWnd := Classes.AllocateHWnd(TimeChangeWndProc);
end;
procedure TJJWScheduler.TimeChangeWndProc(var msg: TMessage);
var
i: integer;
begin
case msg.Msg of
WM_TIMECHANGE:
begin
// my things
end;
end;
end;
このコードは、Windowsサービス内で実行されています。問題は、システム時刻を変更しても起動されないことです。
ブロードキャストメッセージ(WM_TIMECHANGE)がウィンドウに配信されないのはなぜですか?ループなしでこれを行う別の方法はありますか?
編集
理由はわかりませんが、そのウィンドウへのメッセージを処理するようにPeekMessageをハードコーディングすると、すべてが正常に機能するようになります。以下のコードは私の問題を解決しました:
var
msg: TMsg;
if PeekMessage(msg, fTimeChangeWnd, WM_TIMECHANGE, WM_TIMECHANGE, PM_REMOVE) then
begin
TranslateMessage(msg);
DispatchMessage(msg);
end;
この回避策は非常に奇妙です。私はすでに他のウィンドウでメッセージを処理しているので(一般的なProcessMessagesによって)、このウィンドウだけがメッセージを処理していません。