delphi – 如何通知Windows服务中的时间更改
我创建了一个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,PM_REMOVE) then begin TranslateMessage(msg); DispatchMessage(msg); end; 这种解决方法非常奇怪,因为我已经有其他窗口处理消息(通过通用ProcessMessages),只有这一个没有处理它的消息. 解决方法
您的窗口没有收到WM_TIMECHANGE消息的原因是您的窗口是从辅助线程创建的.
进程中的每个线程都有自己的消息队列.在为消息队列提供服务时会传递同步消息,因此,对于像WM_TIMECHANGE这样的非排队消息,您需要为辅助线程消息队列提供服务,以便传递消息. 例如,查看
PeekMessage也是如此.它在查看队列之前调度传入的已发送消息. 还有一些其他方式可以发送已发送的消息,但这些是主要的方式. 现在,我怀疑您定期从辅助线程发送消息可能不方便.如果你的辅助线程什么都不做,那么它可以简单地放在传统的GetMessage,TranslateMessage,DispatchMessage循环中.大多数情况下,它会愉快地阻止GetMessage调度任何传入的已发送消息.但是如果你的辅助线程做了更多的工作,那么这可能不是一个可行的选择. 您已在主服务线程上运行并为消息队列提供服务.使侦听器窗口与主服务线程具有亲缘关系可能更有意义.通过从主服务线程中运行的代码创建它来做到这一点. 另请注意,AllocateHWnd记录为不是线程安全的.您不能从进程主线程以外的任何线程调用它.因此,如果您希望保留在辅助线程上,则需要使用CreateWindow而不是AllocateHWnd.但这也许是将此窗口移到主线程上的另一个好理由. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |