Доброго времени суток!
Задача: отобразить форму оповещения поверх всех окон своей программы и Windows.
Воплощение
procedure TFormPopup.FormCreate(Sender: TObject);
begin
// Делаем форму поверх всех окон
{Функция SetWindowPos изменяет размер, позицию и Z-последовательность дочернего, выскакивающего или верхнего уровня окна.
Дочерние, выскакивающие и верхнего уровня окна размещаются по порядку согласно их появлению на экране.
Самое верхнее окно принимает самый высокий ранг и становится первым окном в Z-последовательности.}
SetWindowPos(Self.Handle, HWND_TOPMOST, Left, Top, Width, Height, SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE);
{Функция SetWindowLong изменяет атрибуты определяемого окна. Функция также устанавливает 32-разрядное (длинное) значение
при заданном смещении в дополнительном пространстве памяти об окне.}
SetWindowLong(Self.Handle, GWL_HWNDPARENT, GetDesktopWindow);
end;
procedure TFormPopup.ProcShowPopup(ImageIndex: Integer);
begin
Self.Left := Screen.WorkAreaWidth - Self.Width;
Self.Top := Screen.WorkAreaHeight - Self.Height;
Self.Show;
end;
Работает. Но если в моей программе открыта форма с полем ввода, и во время набора текста появляется оповещение, то фокус сразу же пропадает с этого поля и далее набираемый текст уходит в никуда.