如何在Windows任务栏中显示没有显示应用程序图标的MessageBox?

时间:2018-10-11 20:25:10

标签: delphi messagebox delphi-10-seattle

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

例如:

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

发生这种情况时,每次在Windows任务栏中也显示目标应用程序的图标,而我不希望这样做。

然后我要显示这些消息,而无需在任务栏中显示应用程序图标。 怎么做?

1 个答案:

答案 0 :(得分:7)

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

在DLL中,Application.Handle默认情况下为0,因此您的MessageBox对话框未显示所有者窗口。这就解释了为什么它可以显示在任务栏上的原因,因为在那里只能显示一个顶级的无主窗口(具有APP_EX_APPWINDOW扩展样式)。

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

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

1:在更高的Delphi版本中,Application.MessageBox使用Application.OnGetActiveFormHandle事件,Win32 GetActiveWindow()函数和Win32 GetLastActivePopup()函数(按此顺序)在使用Application.Handle之前找到合适的所有者窗口。