我正在尝试响应某些窗口 和应用程序 消息,但我多次收到它们。
例如,我编写了以下代码以在使用 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 中测试。
编辑:澄清一下,我的目的是了解发生的原因,而不是如何绕过多次调用。无论如何,如果无法回答这个问题,我可能会接受一个答案。
EDIT2:删除了 Delphi 标签,因为它似乎不是 Delphi 问题。
最佳答案
您的代码是正确的。听起来 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;
关于windows - 为什么我会收到多个相同类型的窗口消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8746672/