То, что вы пытаетесь сделать, идет вразрез с VCL и, вероятно, идет вразрез с обычными ожиданиями пользователей: когда отображается новое окно, если оно не является окном инструмента, обычное (и ожидаемое) поведение заключается в перемещении фокуса на него.Win32 Api для отображения окна - ShowWindow , и оно активирует окно, если не указан флаг SW_SHOWNOACTIVATE
(или один из его вариантов).
Когда вы создаете VCLформа видна, вызов этой функции также сделан.Вызов ShowWindow
похоронен в procedure TCustomForm.CMShowingChanged(var Message: TMessage)
, процедуре из 135 строк, которая жестко кодирует флаг SW_SHOWNORMAL
(т. Е. Флаг активации) для вызова ShowWindow
, который выполняет VCL.К сожалению, это большой кусок кода, и переопределить его будет непросто.Если бы это была моя программа, я бы, вероятно, попытался изменить код на месте: я бы добавил флаг DoNotActivate:Boolean
на TCustomForm
и изменил бы одну строку кода в CMShowingChanged
, которая вызывает ShowWindow
чтобы формы не-MDI учитывали этот флаг и просто вызывали ShowWindow(Handle, SW_SHOWNOACTIVATE)
.Если изменение VCL - это не то, что вы сделали бы беззаботно, вы можете использовать следующее хакерское решение:
Предлагаемый мной трюк - создать новую форму (та, которая содержит TWebBrowser
), ноНЕ устанавливайте для свойства Visible
значение True
.Вместо этого сделайте ручные вызовы ShowWindow(Handle, SW_SHOWNOACTIVATE
), чтобы показать форму без ее активации.Поскольку этот код больше не будет кодировать через обычный Delphi VCL, собственные элементы управления не будут автоматически создаваться и показываться, поэтому вызов ShowWindow(...)
должен выполняться рекурсивно для всех TWinControl
потомков формы:
procedure TForm15.Button1Click(Sender: TObject);
var F: TForm16;
procedure RecursiveShowNoActivate(W: TWinControl);
var i:Integer;
begin
ShowWindow(W.Handle, SW_SHOWNOACTIVATE);
for i:=0 to W.ControlCount-1 do
if W.Controls[i] is TWinControl then
RecursiveShowNoActivate(TWinControl(W.Controls[i]));
end;
begin
F := TForm16.Create(Application);
F.Top := Top + height; // So the new form doesn't overlap mine
RecursiveShowNoActivate(F);
F.WebBrowser1.Navigate('http://msdn.microsoft.com/en-us/library/ms123401');
end;
Есть еще одна загвоздка с этим кодом: убедитесь, что вы переходите на веб-страницу, на которой нет формы, которая автоматически фокусируется.Переход к библиотеке MSDN от Microsoft может быть необычным для примера кода, но этот канонический пример (www.google.com) фокусируется на форме поиска.