Уловка, которую я недавно использовал, заключалась в применении этих двух строк кода при создании каждой формы:
SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or
WS_EX_APPWINDOW or WS_EX_TOPMOST);
SetWindowLong(Handle, GWL_HWNDPARENT, GetDesktopWindow);
Ручка - это ручка формы (Form1.Handle). Часть WS_EX_APPWINDOW заставляет каждое окно появляться на панели задач, удалите его, если вы не хотите, чтобы этот дополнительный эффект.
Для основной формы я использую эту строку:
SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or
WS_EX_TOPMOST);
Я также использую эту функцию, чтобы помочь создавать свои собственные диалоги (я создал новую функцию для каждого стиля диалога - ошибка, подтверждение и т. Д.):
function CustomDlg(const AMessage : string; const ADlgType: TMsgDlgType;
const AButtons: TMsgDlgButtons; const ADefaultButton: TMsgDlgBtn) : TForm;
begin
Result := CreateMessageDialog(AMessage, ADlgType, AButtons, ADefaultButton);
with Result do
begin
SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or
WS_EX_APPWINDOW or WS_EX_TOPMOST);
SetWindowLong(Handle, GWL_HWNDPARENT, GetDesktopwindow);
FormStyle := fsStayOnTop;
BringToFront;
end;
end;
Часть FormStyle := fsStayOnTop;
, конечно, необязательна, но я использую ее, чтобы мои диалоги подтверждения и ошибок всегда были видны пользователю.
Это похоже на небольшую работу, но в итоге мне больше не нужно беспокоиться о формах, случайно скрывающихся за другими формами.