我创建了一个 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),只有这个不处理它的消息。