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

How display MessageBox without show application icon in Windows taskbar?

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

例如:

Application.MessageBox('successful operation!','Information',mb_Ok+mb_IconInformation);

碰巧每次显示这个时,Windows 任务栏中也会显示目标应用程序的图标,我不想要这个。

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

在 Delphi7 中,Application.MessageBox() 调用 Win32 API MessageBox() 函数指定 Application.Handle 作为所有者 window 1.

在 DLL 中,Application.Handle 默认为 0,因此显示您的 MessageBox 对话框时没有分配所有者 window。这就解释了为什么它能够出现在任务栏上,因为只有顶级无主 window(具有 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 event, the Win32 GetActiveWindow() function, and the Win32 GetLastActivePopup()函数(按此顺序)在window之前找到合适的所有者求助于 Application.Handle.