我有一个注入到进程中的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
之前找到合适的所有者窗口。