Delphi 如何在Windows任务栏中不显示应用程序图标而显示MessageBox?

Delphi 如何在Windows任务栏中不显示应用程序图标而显示MessageBox?,delphi,messagebox,delphi-10-seattle,Delphi,Messagebox,Delphi 10 Seattle,我有一个被注入进程的dll,这个dll包含一个表单,我想在其中使用MessageBox()(或其他类型的对话框)来提醒用户某些操作 例如: 碰巧每次显示时,也会在Windows任务栏中显示目标应用程序的图标,我不希望出现这种情况 然后我想在任务栏中不显示应用程序图标的情况下显示这些消息。 如何做到这一点?在Delphi 7中,应用程序.MessageBox()调用Win32 API函数,指定应用程序.Handle作为所有者窗口1 在DLL中,默认情况下,应用程序.Handle为0,因此显示的消息

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

例如:

碰巧每次显示时,也会在Windows任务栏中显示目标应用程序的图标,我不希望出现这种情况

然后我想在任务栏中不显示应用程序图标的情况下显示这些消息。
如何做到这一点?

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

在DLL中,默认情况下,
应用程序.Handle
为0,因此显示的
消息框
对话框没有指定所有者窗口。这就解释了为什么它可以出现在任务栏上,因为只有顶级无主窗口(带有
APP\u EX\u APPWINDOW
extended样式)可以出现在任务栏上

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

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


1:在以后的Delphi版本中,
应用程序.MessageBox
使用事件、Win32函数和Win32函数(按顺序)来查找合适的所有者窗口,然后再使用
应用程序。Handle

调用MessageBoxinstead@DavidHeffernan非常感谢。成功了。为了澄清David的评论,请调用Win32 API
MessageBox()
函数,而不是VCL的
Application.MessageBox()
方法。如果我可以向上投票两次,我会的。我从来不知道
AttachThreadInput()
Application.MessageBox('successful operation!','Information',mb_Ok+mb_IconInformation);