我有一个注入到进程中的dll,并且该dll包含一个表单,我想在其中使用MessageBox()
(或其他某种类型的对话框)来提醒用户某些操作。
例如:
Application.MessageBox('successful operation!','Information',mb_Ok+mb_IconInformation);
发生这种情况时,每次在Windows任务栏中也显示目标应用程序的图标,而我不希望这样做。
然后我要显示这些消息,而无需在任务栏中显示应用程序图标。 怎么做?
答案 0 :(得分:7)
在Delphi 7中,Application.MessageBox()
调用Win32 API MessageBox()
函数,将Application.Handle
指定为所有者窗口 1 。
在DLL中,Application.Handle
默认情况下为0,因此您的MessageBox
对话框未显示所有者窗口。这就解释了为什么它可以显示在任务栏上的原因,因为在那里只能显示一个顶级的无主窗口(具有APP_EX_APPWINDOW
扩展样式)。
因此,最简单的解决方案是自己调用Win32 API MessageBox()
函数,并指定属于您注入DLL的应用程序的所有者HWND
。或者,如果您想继续使用Application.MessageBox()
,则在注入DLL之后将这样的HWND
分配给Application.Handle
属性。
但是无论哪种方式,请确保正在调用MessageBox()
的线程已附加到所选所有者HWND
的消息队列中。如果要在单独的线程中调用MessageBox()
,请在调用MessageBox()
之前使用AttachThreadInput()
建立附件,并在MessageBox()
退出后再次删除附件。
1:在更高的Delphi版本中,Application.MessageBox
使用Application.OnGetActiveFormHandle
事件,Win32 GetActiveWindow()
函数和Win32 GetLastActivePopup()
函数(按此顺序)在使用Application.Handle
之前找到合适的所有者窗口。