В Delphi 7 Application.MessageBox()
вызывает Win32 API функцию MessageBox()
, указывающую Application.Handle
в качестве окна владельца 1 .
Внутри DLL, Application.Handle
по умолчанию равно 0, поэтому ваш диалог MessageBox
отображается без назначенного ему окна владельца.Это объясняет, почему оно может отображаться на панели задач, поскольку там может отображаться только неиспользуемое окно верхнего уровня (с расширенным стилем APP_EX_APPWINDOW
).
Итак, самое простое решение - вызвать Win32 APIMessageBox()
действует самостоятельно, указывая владельца HWND
, который принадлежит приложению, в которое вы внедрили свою DLL.Или, если вы хотите продолжать использовать Application.MessageBox()
, назначьте такое HWND
свойству Application.Handle
после внедрения DLL.
Но в любом случае убедитесь, что поток, вызывающий MessageBox()
прикреплен к очереди сообщений выбранного владельца HWND
.Если вы звоните MessageBox()
в отдельном потоке, используйте AttachThreadInput()
, чтобы сделать это вложение перед вызовом MessageBox()
, и снова, чтобы удалить вложение после выхода MessageBox()
.
1: в более поздних версиях Delphi Application.MessageBox
использует событие Application.OnGetActiveFormHandle
, функцию Win32 GetActiveWindow()
и Win32 GetLastActivePopup()
функция (в таком порядке), чтобы найти подходящее окно владельца, прежде чем использовать Application.Handle
.