delphi - 如何在 Windows 任务栏中显示 MessageBox 而不显示应用程序图标?
问题描述
我有一个注入到进程中的 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()
函数,指定HWND
属于您已将 DLL 注入到的应用程序的所有者。或者,如果您想继续使用,请在注入 DLL 后将Application.MessageBox()
此类分配给HWND
属性。Application.Handle
但无论哪种方式,请确保正在调用的线程MessageBox()
附加到所选所有者的消息队列HWND
。如果您MessageBox()
在单独的线程中调用,请AttachThreadInput()
在调用之前使用该附件,并在退出MessageBox()
后再次删除附件。MessageBox()
1:在以后的Delphi版本中,在Application.MessageBox
使用.Application.OnGetActiveFormHandle
GetActiveWindow()
GetLastActivePopup()
Application.Handle
推荐阅读
- javascript - 有没有办法使用Javascript的 Array.map 函数来返回对象+添加到它的新键值对
- python - Python中列表的回文检查
- python - SQLAlchemy声明性mixin类上的自引用外键关系与declared_attr
- microsoft-cognitive - 微软认知翻译文本 API
- keras - 如何使用 keras 将检查点保存到路径?
- php - 当我向查询中添加内容时,为什么对象会在非对象中发生变化
- c++ - C++ 中的 RPN 计算器(CodeBlocks 控制台)
- python - 使用opencv调整文件夹中的批量图像大小
- c# - 在 C# 中获取“#”哈希后的 URL 部分
- c# - 如何在 .net core 2.0 中压缩 Web API HttpClient 返回的响应?