delphi TApplicationEvents.OnMessage不捕获WM_CLIPBOARDUPDATE消息

1l5u6lss  于 2022-11-04  发布在  其他
关注(0)|答案(1)|浏览(168)

为了在Windows 10中的剪贴板内容发生更改时得到通知,我通常使用TApplicationEvents组件和以下代码:

procedure TformMain.AppEventsMainMessage(var Msg: tagMSG; var Handled: Boolean);
begin
  case Msg.message of
    Winapi.Messages.WM_CLIPBOARDUPDATE:
      begin
        CodeSite.Send('TformMain.AppEventsMainMessage: WM_CLIPBOARDUPDATE');
      end;
  end;
end;

通常情况下,它是有效的。所以我在一个现有的大型项目中也使用了这段代码。但是在那里,WM_CLIPBOARDUPDATE消息没有在TApplicationEvents.OnMessage事件处理程序中被触发!
什么因素会阻止TApplicationEvents.OnMessage事件处理程序捕获此消息?
编辑:只有当使用AddClipboardFormatListener函数时,它才能在我的项目中工作:

procedure TformMain.FormCreate(Sender: TObject);
begin
  Winapi.Windows.AddClipboardFormatListener(Handle);

procedure TformMain.FormDestroy(Sender: TObject);
begin
  Winapi.Windows.RemoveClipboardFormatListener(Handle);

Private
  procedure WMClipboardUpdate(var Msg: TMessage); message WM_CLIPBOARDUPDATE;

implementation

  procedure TformMain.WMClipboardUpdate(var Msg: TMessage);
  begin
    CodeSite.Send('TformMain.WMClipboardUpdate: WM_CLIPBOARDUPDATE');
  end;

但是,这并没有回答“是什么原因阻止TApplicationEvents.OnMessage事件处理程序捕获此消息?”

i2loujxw

i2loujxw1#

当剪贴板更新时,Windows不会将WM_CLIPBOARDUPDATE广播到所有窗口。相反,如果您想得到通知,您必须注册您的窗口。从AddClipboardFormatListener的文档中可以看到:
将给定的窗口放在系统维护的剪贴板格式侦听器列表中。
当一个窗口被添加到剪贴板格式侦听器列表中时,只要剪贴板的内容发生了变化,它就会发布一条WM_CLIPBOARDUPDATE消息。
所以你打完电话之后

AddClipboardFormatListener(Handle)

当剪贴板被更改时,带有HWND Handle的窗口将显示WM_CLIPBOARDUPDATE消息。如果您在

AddClipboardFormatListener(Handle)

在你的TformMain.FormCreate中,那么Handle就意味着Self.Handle,也就是说,与TformMain相关的窗口将被发布消息。因此,它们可以被你的TformMain

procedure WMClipboardUpdate(var Msg: TMessage); message WM_CLIPBOARDUPDATE;

但是如果您有第二个表单TformSecond,它将不会收到任何这样的消息,因为您只注册了TformMain
此外,* 发布 * 到应用窗口的任何消息都将通过您的TApplicationEvents。这意味着,如果您使用AddClipboardFormatListener在应用中注册了 * 任何 * 窗口,则应用中的任何TApplicationEvents都将看到此消息。

相关问题