如何在 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
.
我有一个注入到进程中的 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
.