为了在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
事件处理程序捕获此消息?”
1条答案
按热度按时间i2loujxw1#
当剪贴板更新时,Windows不会将
WM_CLIPBOARDUPDATE
广播到所有窗口。相反,如果您想得到通知,您必须注册您的窗口。从AddClipboardFormatListener
的文档中可以看到:将给定的窗口放在系统维护的剪贴板格式侦听器列表中。
当一个窗口被添加到剪贴板格式侦听器列表中时,只要剪贴板的内容发生了变化,它就会发布一条
WM_CLIPBOARDUPDATE
消息。所以你打完电话之后
当剪贴板被更改时,带有HWND
Handle
的窗口将显示WM_CLIPBOARDUPDATE
消息。如果您在在你的
TformMain.FormCreate
中,那么Handle
就意味着Self.Handle
,也就是说,与TformMain
相关的窗口将被发布消息。因此,它们可以被你的TformMain
的但是如果您有第二个表单
TformSecond
,它将不会收到任何这样的消息,因为您只注册了TformMain
。此外,* 发布 * 到应用窗口的任何消息都将通过您的
TApplicationEvents
。这意味着,如果您使用AddClipboardFormatListener
在应用中注册了 * 任何 * 窗口,则应用中的任何TApplicationEvents
都将看到此消息。