21

フォーカスを失うことなく、メイン フォームの上に 2 番目のフォームを表示するのに苦労しています。

を試しShowWindow(second.handle, SW_SHOWNOACTIVATE)ましたが、メインフォームがフォーカスを失います。2 番目のウィンドウに設定Visible := falseすると、呼び出しShowWindowによって 2 番目のフォームがアクティブになりませんが、ウィンドウが表示されると空になります...

誰かがこれのための良いレシピを持っていますか?

更新:私がやろうとしているのは、特定のイベントで通知ウィンドウを表示することです。メイン フォームがいつでもフォーカスを失わないことが重要です。

4

7 に答える 7

29

コードに何か問題があるはずです。

私はこのコードをテストしました、それは動作します:

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

Visibleではなく、使用に注意してくださいShow!それ以外の場合は、SW_SHOWNOACTIVATE.

于 2009-03-31T13:24:40.780 に答える
2

私は過去にこれを使用しました

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

Delphiの最近のバージョンではこれをテストしていませんが...

于 2009-03-31T15:42:06.363 に答える
1

可能であれば、何らかのツール ヒント ウィンドウを使用して通知情報を表示することを検討してください。ツール ヒントが表示されたとき、またはユーザーがクリックしたときに、メイン ウィンドウからフォーカスが奪われることはありません。通常のフォームにはデフォルトで境界線があり、ユーザーがその境界線をクリックすると、メイン フォームのフォーカスが失われます。

これを行うための基本的なコードを次に示します。free が呼び出されるとヒントは消えます。ただし、スリープを使用するよりもタイマーを設定した方がよいでしょう。

with THintWindow.Create(nil) do
  try
    ActivateHint(MyRect, 'My Notification');
    Sleep(DisplayTime);
  finally
    Free;
  end
于 2009-03-31T17:40:16.530 に答える
0

ダニエルズのコード...

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

2 番目のフォームが動的に作成されるまで。次に、2 番目のフォームは、デフォルトの幅と高さで位置 0,0 に配置されます。

ShowWindowが実行されるとしばらくの間、画面に 2 番目のフォームが表示され、次の行が実行されると消えます。

動的に作成された透明なオーバーレイ フォームのコードを使用しています。次のコードは、指定された回答の組み合わせであり、アクティブ化せずに 2 番目のフォームを親フォームの上に配置します。

SetWindowPos(Form2.Handle, HWND_TOP, Left, Top, Width, Height, SWP_NOACTIVATE);
Form2.Visible := True;
于 2016-05-17T10:01:27.680 に答える