Недавно созданное модальное окно теряет фокус и становится недоступным в Windows Vista - PullRequest
10 голосов
/ 13 апреля 2009

Иногда, когда я открываю модальное окно в моем приложении Delphi, требуется некоторое время, чтобы увидеть, тогда я замечаю, что приложение вроде заблокировано, и произошло то, что модальная форма была открыта с помощью ShowModal, но не отображалась и приложение стало заблокированным, как будто модальное окно было в первом слое.

Обычно, когда это происходит, мне нужно использовать Alt + Tab или Windows + Tab, чтобы найти «скрытое» модальное окно, но это не всегда работает.

Такое поведение просто происходит в Vista, но это довольно раздражает.

Есть ли какой-нибудь способ предотвратить эту "странную фокусировку"?

Спасибо.

* РЕДАКТИРОВАТЬ *

Видимо, установка Application.MainFormOnTaskbar: = True решила проблему, но еще слишком рано делать выводы, потому что это происходит случайным образом.

* РЕДАКТИРОВАТЬ 2 *

ModalFormOnTaskbar не решил проблему, после этого я попытался установить PopupMode = pmAuto, но это только усугубило проблему.

Прямо сейчас я пытаюсь явно установить PopupParent и сообщит вам, если проблема решена.

Ответы [ 6 ]

8 голосов
/ 13 апреля 2009

Посмотрите на свойство PopupParent. Возможно, вы захотите установить его явно для вашей модальной формы до вызова ShowModal. Когда PopupParent равен nil (по умолчанию), VCL ведет себя немного по-разному в зависимости от значения соответствующего свойства PopupMode.

Если вы установите PopupParent модальной формы в форму, активную непосредственно перед вызовом ShowModal, это может помочь.

7 голосов
/ 13 апреля 2009

Проблема, с которой вы начали сталкиваться, когда Windows XP представила концепцию окошко для окон . Из-за необычной архитектуры, которую использует Delphi (все формы являются потомками скрытого окна - TApplication ), многие приложения Delphi сталкиваются с той же проблемой.

Один из способов быстро решить эту проблему - отключить окошко-окно при инициализации приложения:

var 
  User32: HMODULE; 
  DisableProcessWindowsGhosting: TProcedure; 
begin 
  User32 := GetModuleHandle('USER32'); 
  if User32 <> 0 then 
  begin 
    DisableProcessWindowsGhosting := GetProcAddress(User32, 'DisableProcessWindowsGhosting'); 
    if Assigned(DisableProcessWindowsGhosting) then 
      DisableProcessWindowsGhosting; 
  end; 
end;

Другое возможное (более элегантное, хотя и трудоемкое) решение - нормализовать ваше приложение Delphi .

Третьим вариантом будет переключение на Delphi 2006 (Delphi 10.0) .

Помимо проблемы, о которой вы сообщаете, архитектура Delphi привносит еще больше странностей, в том числе различные меню панели задач и невозможность flash .

2 голосов
/ 25 ноября 2010

Мне удалось уменьшить количество таких случаев, удалив все вызовы Application.ProcessMessages, которые есть в моем коде, где бы я ни находился.

1 голос
/ 18 февраля 2015

Alt+P+V (.dpr) имеет Application.MainFormOnTaskbar := True; по умолчанию, я не знаю почему, но если я поставлю Application.MainFormOnTaskbar := False;, проблема решена.

0 голосов
/ 01 мая 2019

У меня была такая же проблема в Windows 10, и я решил ее, заменив в файле dpr / dproj:

... Application.CreateForm (TFrmMain, FrmMain);

Application.run; ...

К

... Application.CreateForm (TFrmMain, FrmMain);

Try FrmMain.ShowModal; в заключение FrmMain.Free; End;

0 голосов
/ 05 августа 2009

Вы можете попробовать отредактировать Forms.pas, чтобы добавить приведенный ниже код в TCustomForm.ShowModal() непосредственно перед вызовом Application.ModalStarted():

if Assigned(Application) then begin
  while PeekMessage(msg, Application.Handle, CM_ACTIVATE, CM_DEACTIVATE, PM_REMOVE) do begin
    TranslateMessage(msg);
    DispatchMessage(msg);
  end;
end;
...