Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.02.2021, 14:19   #1
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
Вопрос Оповещение поверх всех окон. Потеря фокуса

Доброго времени суток!
Задача: отобразить форму оповещения поверх всех окон своей программы и 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;
Работает. Но если в моей программе открыта форма с полем ввода, и во время набора текста появляется оповещение, то фокус сразу же пропадает с этого поля и далее набираемый текст уходит в никуда.
Shouldercannon вне форума Ответить с цитированием
Старый 21.02.2021, 09:01   #2
beegl
instagram
Участник клуба
 
Аватар для beegl
 
Регистрация: 24.05.2008
Сообщений: 1,451
По умолчанию

Оповещение: "обычная" потеря фокуса окна )

Код:
   if GetFocus <=0 then // потеря фокуса окна
   begin
   if MessageBox(GetForegroundWindow(),'нету фокуса','Focus Inform',MB_YESNO or MB_ICONWARNING) = IDYES then
    Close else
    GetForegroundWindow(); // окно на передний план
    SetForegroundWindow(Application.Handle); // окно на передний план
   end;
beegl вне форума Ответить с цитированием
Старый 10.03.2021, 10:17   #3
Heneken87
Форумчанин
 
Регистрация: 27.04.2012
Сообщений: 219
По умолчанию

Если честно я уже оскомину себе набил с формами и потерей фокуса. И недонократно, реализовываешь, вроде работает. А потом начинается в Win10 баг какой нибудь, при каких то чудом сложившихся обстоятельствах..... Либо все нормально, фокуса нет, форма поверх других..но потом смотришь , а она у тебя на панели задач светиться или еще какая нибудь дичь вылетит, которую не ожидаешь даже....

В итоге плюнул и сделал фрейм, вынес в глобалку и использую конструкцию SetMessage('ля-ля',Self). Тупо передаю родителя.....может это и криво, зато блин с фокусом теперь проблем нету нигде, да и особых неудобств не возникает =))
Пишу много и развернуто

Последний раз редактировалось Heneken87; 10.03.2021 в 10:24.
Heneken87 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поверх всех окон timyr1997 Общие вопросы Delphi 12 05.08.2010 15:49
поверх всех окон blackstersl Общие вопросы Delphi 6 05.08.2010 15:36
поверх всех окон Temka Общие вопросы Delphi 4 31.05.2009 14:09
Поверх всех окон delphin100 Общие вопросы Delphi 2 19.04.2008 19:00
Поверх всех окон Патрон Общие вопросы Delphi 1 18.04.2008 16:57