Перейти к содержанию
Fire Monkey от А до Я
  • 0

Фокус окна после разворачивания из трея


Вадим Смоленский

Вопрос

В FireMonkey приходится перехватывать сообщения Windows, чтобы обеспечить корректное сворачивание и разворачивание окон. Это здесь уже обсуждалось. Я в итоге сделал у себя так:

var TheFormIsMinimized: Boolean = False;
    TheFormWasMaximized: Boolean = False;

function NewWndProc(Wnd: HWND; Msg: UINT; WParam: WPARAM; LParam: LPARAM): LRESULT; stdcall;
begin
 if (Msg = WM_SHOWWINDOW) and (LParam = SW_PARENTCLOSING) and (not TheFormIsMinimized) then
     begin
      TheFormIsMinimized := True;
      TheFormWasMaximized := (MainForm.WindowState=TWindowState.wsMaximized);
      SendMessage(FormToHWND(MainForm), WM_SYSCOMMAND, SC_MINIMIZE, 0);
      MainFormp.WindowState := TWindowState.wsMinimized;
     end else
 if (Msg = WM_SHOWWINDOW) and (LParam = SW_PARENTOPENING) and (TheFormIsMinimized) then 
     begin
      TheFormIsMinimized := False;
      SendMessage(FormToHWND(MainForm), WM_SYSCOMMAND, SC_RESTORE, 0);
      if TheFormWasMaximized
         then begin
               SendMessage(FormToHWND(MainForm),WM_SYSCOMMAND,SC_MAXIMIZE,0);
               LookUp.WindowState:=TWindowState.wsMaximized;
              end
         else begin
               SendMessage(FormToHWND(MainForm),WM_SYSCOMMAND,SC_RESTORE,0);
               LookUp.WindowState:=TWindowState.wsNormal;
              end;
     end
  else Result:=CallWindowProc(OldWndProc, Wnd, Msg, WParam, LParam);
end;

Это работает — но восстановленное из трея окно находится не в фокусе. Пользователь должен дополнительно щелкнуть по нему мышкой. Вставка оператора SetFocus(FormToHWND(MainForm)) непосредственно сюда же ничего не дает — равно как и операторов SendMessage(FormToHWND(MainForm),WM_ACTIVATE,WA_ACTIVE,0),   Winapi.Windows.SetActiveWindow(FormToHwnd(MainForm)) или SetForegroundWindow(FormToHWND(MainForm)). Мне приходится запускать из этого места специальный таймер — и уже в обработчике таймера, после некоторой задержки, вызывать SetFocus(FormToHWND(MainForm)). Но и это работает не всегда. Например, если окно было развернуто на весь экран, а свернуто было щелчком по кнопке «Свернуть все окна», то после его разворачивания опять фокуса нет (насколько могу судить, в этом случае не запускается таймер). Нет ли более изящного и надежного способа наладить фокус?

Ссылка на комментарий

Рекомендуемые сообщения

  • 0
5 часов назад, haword сказал:

в 10.4.1 нет такой проблемы вообще

Это замечательная новость. Но у меня 10.2, и бесплатно обновиться до 10.4, как я понимаю, нельзя.

Ссылка на комментарий
  • 0
В 06.04.2021 в 13:34, Вадим Смоленский сказал:

Это замечательная новость. Но у меня 10.2, и бесплатно обновиться до 10.4, как я понимаю, нельзя.

никто вам старую машину на новую не поменяет ) 

но кто хочет найти выход тот находит. особенно если это касается ПО где старые глюки правят в новых только версиях, добавляя при этом новых )

Ссылка на комментарий
  • 0
19 часов назад, haword сказал:

кто хочет найти выход тот находит

Ну вот я и хочу найти выход. И пока не нахожу. Оттого и обратился к коллективному разуму.

Ссылка на комментарий
  • 0
В 11.04.2021 в 12:31, Вадим Смоленский сказал:

Ну вот я и хочу найти выход. И пока не нахожу. Оттого и обратился к коллективному разуму.

а что тут искать то? это ошибка огнеобезьяны. Либо находите способ как обновиться до 10.4.1, либо ищите исходники огнеобезьяны от 10.4.1 сравниваете со своими и добавляете изменения, подкидывайте их в свой проект и радуетесь. больше никак. 

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...