如何在Windows任务栏中显示消息框而不显示应用程序图标?



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

例如:

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

碰巧每次显示此内容时,Windows任务栏中都会显示目标应用程序的图标,我不想要这个。

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

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

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

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

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

1:在后来的Delphi版本中,Application.MessageBox使用Application.OnGetActiveFormHandle事件,Win32GetActiveWindow()函数和Win32GetLastActivePopup()函数(按该顺序(在诉诸使用Application.Handle之前找到合适的所有者窗口。

最新更新