Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Оповещение поверх всех окон. Потеря фокуса  (Прочитано 25442 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Shouldercannon
Помогающий

ru
Offline Offline

« : 20-02-2021 07:13 » 

Доброго времени суток!
Задача: отобразить форму оповещения поверх всех окон своей программы и Windows.
Воплощение
Код: (Delphi)
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;
Работает. Но если в моей программе открыта форма с полем ввода, и во время набора текста появляется оповещение, то фокус сразу же пропадает с этого поля и далее набираемый текст уходит в никуда.
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 21-02-2021 16:42 » new

В этом вся диалектика оповещений. Меня они дико бесят. Вангую, через пару лет от них избавятся.
В 10-й винде и в Убунте есть свои системы оповещений, без фокуса.

В твоем случае: уходи от форм и попапов и прочей старой дребедени, они всегда фокус забирают. Сделай новый класс окна, который просто нарисуешь. Под классом имеется в виду не дельфи, а винда.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines