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

1 delphi messagebox delphi-10-seattle

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

例如:

Application.MessageBox('successful operation!','Information',mb_Ok+mb_IconInformation);
Run Code Online (Sandbox Code Playgroud)

发现每次显示,也会在Windows任务栏中显示目标应用程序的图标,我不想这样.

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

Rem*_*eau 7

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

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

因此,最简单的解决方案是自己调用Win32 API MessageBox()函数,指定HWND属于您已将DLL注入的应用程序的所有者.或者,如果你想继续使用Application.MessageBox(),分配这种HWNDApplication.Handle财产的DLL已经注入之后.

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

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