Delphi 如何在Windows任务栏中不显示应用程序图标而显示MessageBox?
我有一个被注入进程的dll,这个dll包含一个表单,我想在其中使用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,因此显示的消息
MessageBox()
(或其他类型的对话框)来提醒用户某些操作
例如:
碰巧每次显示时,也会在Windows任务栏中显示目标应用程序的图标,我不希望出现这种情况
然后我想在任务栏中不显示应用程序图标的情况下显示这些消息。
如何做到这一点?在Delphi 7中,
应用程序.MessageBox()
调用Win32 API函数,指定应用程序.Handle作为所有者窗口1
在DLL中,默认情况下,应用程序.Handle
为0,因此显示的消息框
对话框没有指定所有者窗口。这就解释了为什么它可以出现在任务栏上,因为只有顶级无主窗口(带有APP\u EX\u APPWINDOW
extended样式)可以出现在任务栏上
因此,最简单的解决方案是自己调用Win32 APIMessageBox()
函数,指定属于已将DLL注入的应用程序的所有者HWND
。或者,如果要继续使用Application.MessageBox()
,请在插入DLL后将此类HWND
分配给应用程序.Handle
属性
但无论哪种方式,请确保调用MessageBox()
的线程已附加到所选所有者的消息队列HWND
。如果在单独的线程中调用MessageBox()
,请在调用MessageBox()
之前使用创建该附件,然后在退出MessageBox()
后再次使用删除附件
1:在以后的Delphi版本中,应用程序.MessageBox
使用事件、Win32函数和Win32函数(按顺序)来查找合适的所有者窗口,然后再使用应用程序。Handle
调用MessageBoxinstead@DavidHeffernan非常感谢。成功了。为了澄清David的评论,请调用Win32 APIMessageBox()
函数,而不是VCL的Application.MessageBox()
方法。如果我可以向上投票两次,我会的。我从来不知道AttachThreadInput()
。
Application.MessageBox('successful operation!','Information',mb_Ok+mb_IconInformation);