Акжан в сети - На уровень вверх(VCL, W32) Как изменить положение MessageBox?

Смотpи описание функции MessageDlgPos.

Vladimir Zyrjanov

(2:5020/87.27)

На самом деле выше описан не ответ на поставленный вопрос, а путь обхода.

Тем не менее, проблема решаема, например, с помощью установки обработчика специальных событий Windows. Ниже пример -

const
  hHook : Integer = 0;

function SetInCentre(code: Integer; wparam: WPARAM; lparam: LPARAM): LRESULT
stdcall;
var
  R : TRect;
  X, Y : Integer;
begin
  if code = HCBT_ACTIVATE then
  begin
    GetWindowRect(wparam, R);
    X := (Screen.Width - (R.Right - R.Left)) div 2;
    Y := (Screen.Height - (R.Bottom - R.Top)) div 2;
    SetWindowPos(wparam, 0, X, Y, 0, 0, SWP_NOSIZE or SWP_NOZORDER or
SWP_NOACTIVATE);
    Result := CallNextHookEx(hHook, code, wparam, lparam);
    UnhookWindowsHookEx(hHook);
    hHook := 0;
  end
  else
    Result := 0;
end;

function CMessageBox(hWnd: HWND; lpText, lpCaption: PChar; uType: UINT):
Integer;
begin
  hHook := SetWindowsHookEx(WH_CBT, SetInCentre, 0, GetCurrentThreadId);
  try
    Result := MessageBox(hWnd, lpText, lpCaption, uType);
  finally
    if hHook <> 0 then
    begin
      UnhookWindowsHookEx(hHook);
      hHook := 0;
    end;
  end;
end;

Функциональность метода CMessageBox аналогична функциональности Windows.MessageBox, однако первая функция дополнительно центрирует окно сообщения относительно экрана.

Pavel Schurenko

pasha@ics.kiev.ua