我很难在主要表单上方显示第二个表单而不会失去焦点。
我尝试了ShowWindow(second.handle, SW_SHOWNOACTIVATE)
,但主体形式失去了焦点。
如果我在第二个窗口设置Visible := false
,则对ShowWindow
的调用不会激活第二个窗体,但显示时窗口为空...
有没有人有这方面的好方法?
更新:我正在尝试做的是在给定事件中显示通知窗口。主要形式在任何时候都不会失去焦点,这一点至关重要。
答案 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)
我过去做过这个,但是我没有这个代码,因为它在上一份工作中是道具的(对不起)。
如果我记得很清楚,我所做的是:
代码(步骤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;