windows - 为什么我会收到多个相同类型的窗口消息?

标签 windows winapi

我正在尝试响应某些窗口 和应用程序 消息,但我多次收到它们。

例如,我编写了以下代码以在使用 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/

相关文章:

c++ - 当进程崩溃时,我如何抑制所有错误对话框(我只希望它静默崩溃)

c++ - 无法使用 FindWindowEx 函数找到子窗口

python - 系统路径中安装了多个Python

.net - 拦截和修改文件系统调用 - Windows

c++ - 做一个循环 "slow down"

c++ - 如何在 Win32 中递归创建文件夹?

c++ - 在 Windows 上从用户模式程序发送和接收 ARP 数据

java - 如何制作不会静默失败的可运行 Jar 程序?

java - 程序使用过时的(不是当前的)环境变量值

windows - 如何在 Windows 上同时运行 Docker 和 Android Studio Emulator?