【问题标题】:How display MessageBox without show application icon in Windows taskbar?如何在 Windows 任务栏中显示 MessageBox 而不显示应用程序图标?
【发布时间】:2018-10-11 20:25:09
【问题描述】:

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

例如:

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

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

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

【问题讨论】:

  • 改为调用 MessageBox
  • @DavidHeffernan,谢谢。工作。
  • 为了澄清 David 的评论,请调用 Win32 API MessageBox() 函数而不是 VCL 的 Application.MessageBox() 方法。

标签: delphi messagebox delphi-10-seattle


【解决方案1】:

在 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。

【讨论】:

  • 如果我可以投票两次,我会的。我从来不知道AttachThreadInput()。
猜你喜欢
  • 2011-03-13
  • 1970-01-01
  • 2011-11-12
  • 1970-01-01
  • 1970-01-01
  • 2011-01-22
  • 2011-02-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多