首页 > 解决方案 > 如何在 Windows 任务栏中显示 MessageBox 而不显示应用程序图标?

问题描述

我有一个注入到进程中的 dll,并且该 dll 包含一个表单,我想在其中使用MessageBox()(或其他类型的对话框)来提醒用户有关某些操作的信息。

例如:

Application.MessageBox('successful operation!','Information',mb_Ok+mb_IconInformation);

发生这种情况,每次显示,在Windows任务栏中也显示目标应用程序的图标,我不想要这个。

然后我想在任务栏中显示这些消息而不显示应用程序图标。这个怎么做?

标签: delphimessageboxdelphi-10-seattle

解决方案


在 Delphi 7 中,Application.MessageBox()调用 Win32 APIMessageBox()函数,将 指定Application.Handle为所有者窗口1

在 DLL 中,Application.Handle默认值为 0,因此您的MessageBox对话框在显示时没有分配给它的所有者窗口。这就解释了为什么它能够出现在任务栏上,因为那里只能出现一个顶级的无主窗口(具有APP_EX_APPWINDOW扩展样式)。

因此,最简单的解决方案是自己调用 Win32 APIMessageBox()函数,指定HWND属于您已将 DLL 注入到的应用程序的所有者。或者,如果您想继续使用,请在注入 DLL 后将Application.MessageBox()此类分配给HWND属性。Application.Handle

但无论哪种方式,请确保正在调用的线程MessageBox()附加到所选所有者的消息队列HWND。如果您MessageBox()在单独的线程中调用,请AttachThreadInput()在调用之前使用该附件,并在退出MessageBox()后再次删除附件。MessageBox()

1:在以后的Delphi版本中,在Application.MessageBox使用.Application.OnGetActiveFormHandleGetActiveWindow()GetLastActivePopup()Application.Handle


推荐阅读