Delphi: Показать окно без активации - PullRequest
21 голосов
/ 31 марта 2009

Я изо всех сил пытаюсь показать вторую форму над основной формой, не теряя фокус.

Я пробовал ShowWindow(second.handle, SW_SHOWNOACTIVATE), но основная форма теряет фокус. Если я установлю Visible := false во втором окне, вызов ShowWindow не активирует вторую форму, но при показе окна пустые ...

У кого-нибудь есть хороший рецепт для этого?

ОБНОВЛЕНИЕ: То, что я пытаюсь сделать, - это отображение окна уведомлений при данном событии. Крайне важно, чтобы основная форма не теряла фокус в любое время.

Ответы [ 7 ]

28 голосов
/ 31 марта 2009

Должно быть что-то не так с вашим кодом.

Я тестировал этот код, он работает:

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowWindow(Form2.Handle, SW_SHOWNOACTIVATE);
  Form2.Visible := True;
end;

Будьте осторожны при использовании Visible, а не Show! В противном случае он переопределит SW_SHOWNOACTIVATE.

2 голосов
/ 31 марта 2009

Вы можете показать окно (немодальное) и сбросить фокус на главное окно.

procedure TMainForm.ButtonClick(Sender: TObject);
begin
  OtherForm.Show;
  SetFocus;
end;

Проверено в 2006 году.

Это не показывает другую форму сверху. Но очень противоречиво иметь окно сверху, в котором нет фокуса.

1 голос
/ 31 марта 2009

Я делал это в прошлом, но у меня нет кода, потому что он был проповедником на прошлой работе (извините).

Если я хорошо помню, я сделал:

  1. Из клиентского класса A вызовите процедуру (или функцию), которая не принадлежит ни одному классу (традиционный метод Pascal).
  2. Из этого метода вызовите некоторый метод в классе B, который не наследуется от TForm
  3. Из метода в B создайте экземпляр всплывающей формы P, но без родителя или владельца; и вызвать метод в экземпляре.
  4. Из метода, вызванного в экземпляре, покажите себя.

Код (на шаге 3) может выглядеть примерно так:

var p: TPopupForm;
begin
  p := TPopupForm.Create(nil);
  p.ShowWindow;
  p.Release;
end;

Извините, если это не сработает, у меня тоже нет Delphi.

1 голос
/ 31 марта 2009

Вот вы:

  // you have set your 2nd form as non resizable, without border nor title etc...
  Form2.Enabled := False; // prevent the 2nd form to grab focus even when clicked
  SetWindowPos(Form2.Handle, HWND_TOP, 0, 0, 0, 0, SWP_SHOWWINDOW or SWP_NOACTIVATE or SWP_NOSIZE or SWP_NOMOVE);
  // be sure to hide it automatically when done as it is disabled...
1 голос
/ 31 марта 2009

Если возможно, вам следует рассмотреть возможность использования какого-либо окна всплывающей подсказки для отображения информации уведомления. Подсказка не будет захватывать фокус из главного окна, когда оно отображается или когда пользователь нажимает на него. Обычная форма будет иметь рамку по умолчанию, и если пользователь щелкнет по этой границе, ваша основная форма потеряет фокус.

Вот некоторый базовый код для этого. Наконечник исчезает при вызове free; однако вам лучше установить таймер, чем использовать сон.

with THintWindow.Create(nil) do
  try
    ActivateHint(MyRect, 'My Notification');
    Sleep(DisplayTime);
  finally
    Free;
  end
1 голос
/ 31 марта 2009

Я использовал это в прошлом

SetWindowPos(WindowHandle, HWND_TOP, 0, 0, 0, 0, SWP_NOACTIVATE or SWP_NOSIZE or SWP_NOMOVE);

Я не проверял это в последних версиях Delphi, хотя ...

0 голосов
/ 17 мая 2016

код Дэниелса работает до ...

ShowWindow(Form2.Handle, SW_SHOWNOACTIVATE);
Form2.Visible := True;

Пока ваша вторая форма не будет создана динамически . Тогда ваша вторая форма находится в позиции 0,0 с шириной и высотой по умолчанию.

На короткое время при выполнении ShowWindow вы увидите вторую форму на экране, исчезающую при выполнении следующей строки.

Я использую код для прозрачной оверлейной формы, которая создается динамически. Следующий код представляет собой комбинацию данных ответов и помещает вторую форму без активации поверх родительской формы.

SetWindowPos(Form2.Handle, HWND_TOP, Left, Top, Width, Height, SWP_NOACTIVATE);
Form2.Visible := True;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...