Delphi:显示窗口没有激活

时间:2009-03-31 09:07:07

标签: delphi focus window

我很难在主要表单上方显示第二个表单而不会失去焦点。

我尝试了ShowWindow(second.handle, SW_SHOWNOACTIVATE),但主体形式失去了焦点。 如果我在第二个窗口设置Visible := false,则对ShowWindow的调用不会激活第二个窗体,但显示时窗口为空...

有没有人有这方面的好方法?

更新:我正在尝试做的是在给定事件中显​​示通知窗口。主要形式在任何时候都不会失去焦点,这一点至关重要。

7 个答案:

答案 0 :(得分:28)

您的代码必须有问题。

我测试了这段代码,它有效:

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

小心使用 Visible ,而不是 Show !否则它将覆盖SW_SHOWNOACTIVATE

答案 1 :(得分:2)

您可以显示窗口(非模态)并将焦点重置为主窗口。

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

2006年测试。

这不会在顶部显示其他形式。但是在顶部有一个没有焦点的窗口是非常反直觉的。

答案 2 :(得分:1)

我以前用过这个

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

我没有使用最新版本的Delphi测试这个...

答案 3 :(得分:1)

如果可能,您应该考虑使用某种工具提示窗口来显示通知信息。当工具提示显示或用户点击时,工具提示不会从主窗口中窃取焦点。默认情况下,常规表单将具有边框,如果用户单击该边框,则主表单将失去焦点。

这是执行此操作的一些基本代码。调用free时,尖端消失;但是,设置计时器比使用睡眠更好。

with THintWindow.Create(nil) do
  try
    ActivateHint(MyRect, 'My Notification');
    Sleep(DisplayTime);
  finally
    Free;
  end

答案 4 :(得分:1)

你在这里:

  // 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...

答案 5 :(得分:1)

我过去做过这个,但是我没有这个代码,因为它在上一份工作中是道具的(对不起)。

如果我记得很清楚,我所做的是:

  1. 从客户端类A调用不属于任何类的过程(或函数)(传统的Pascal方法)。
  2. 从该方法中,在B类中调用一些不从TForm继承的方法
  3. 从B中的方法,创建弹出窗体P的实例,但没有父级或所有者;并在实例中调用方法。
  4. 从实例中调用的方法中显示自己。
  5. 代码(步骤3)可能是这样的:

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

    如果这不起作用我很抱歉,我也没有Delphi。

答案 6 :(得分:0)

Daniels代码直到 ......

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;