Как отобразить MessageBox без отображения иконки приложения на панели задач Windows? - PullRequest
0 голосов
/ 11 октября 2018

У меня есть dll, которая вводится в процесс, и эта dll содержит форму, в которой я хочу использовать MessageBox() (или какой-либо другой тип диалога), чтобы предупредить пользователя о некоторых операциях.

Например:

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

Бывает, что каждый раз, когда это показывается, также отображается значок целевого приложения на панели задач Windows, и я не хочу этого.

Тогда я хочу отображать эти сообщения без показа приложениязначок на панели задач.Как сделать это?

1 Ответ

0 голосов
/ 12 октября 2018

В 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.

...