我正在尝试回复一些窗口和应用程序消息,但我多次得到它们.
例如,当使用WM_TIMECHANGE更改系统日期时,我编写以下代码以显示消息框. WMTimeChange被执行多次,我看到多个(大多数时候是两三个)消息框一个接一个地出现.也许,我错过了什么?
unit Unit1; interface uses Windows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,Dialogs; type TForm1 = class(TForm) protected procedure WMTimeChange(var Msg: TMessage) ; message WM_TIMECHANGE; end; var Form1: TForm1; implementation {$R *.dfm} { TForm1 } procedure TForm1.WMTimeChange(var Msg: TMessage); begin showmessage('Date/Time has changed!'); end; end.
在Windows XP中测试.
编辑:只是为了澄清,我的意图是理解为什么会发生这种情况而不是如何绕过多个电话.无论如何,如果无法回答这个问题,我可能会接受一个答案.
解决方法
你的代码是正确的.听起来好像Windows正在多次发送WM_TIMECHANGE消息.
因此,您可以添加一个小的时间滞后比较,让您的信息每天只有1%触发一次,即或多或少15分钟:
type TForm1 = class(TForm) protected FWMTimeChangeTimeStamp: TDateTime; procedure WMTimeChange(var Msg: TMessage) ; message WM_TIMECHANGE; end; var Form1: TForm1; implementation {$R *.dfm} { TForm1 } procedure TForm1.WMTimeChange(var Msg: TMessage); begin if Now-FWMTimeChangeTimeStamp>0.01 then begin showmessage('Date/Time has changed!'); FWMTimeChangeTimeStamp := Now; end; end;