我有以下(简化)程序将所需窗口置于所有其他正常窗口的顶部:
function focusWindow(): boolean;
var
h: Hwnd;
begin
result := true;
h := findwindow('Notepad', 'Unbenannt - Editor');
if h <> 0 then
BringWindowToTop(h);
end;
我在以下示例应用程序中使用它:
在顶部,您可以看到我的示例应用程序。后面有一个资源管理器窗口,背景中有一个空的记事本。如上面的代码所示,我想将记事本窗口移到前面。
如果我从按钮事件处理程序
调用我的函数procedure TForm4.btnFocusClick(Sender: TObject);
begin
focusWindow();
end;
一切都按预期工作。空的记事本窗口向上移动到前面,后面是示例应用程序,浏览器位于其他两个窗口后面。
但是如果我使用vcl功能区控件并将操作分配给命令按钮,则只能部分工作。
procedure TForm4.actDemoExecute(Sender: TObject);
begin
focusWindow();
end;
记事本窗口向上移动,后面的资源管理器窗口离开。但随后程序停止 - 记事本窗口隐藏在我自己的应用程序后面。这里发生了什么?
答案 0 :(得分:1)
我已经有了一些情况,在那里召唤一些东西到顶火,然后是某些东西(可能是某些控件上的mouseUp,但我不确定)用按钮重新调整控件然后放在前面。在这些需要快速解决方法的情况下,添加一个使用bringToFront调用在10或20毫秒内触发的计时器似乎可行。按钮启动计时器,完成它自己的处理,然后计时器执行bringToFront并自行关闭;这使得BringToFront在与按钮交互后发生。我不觉得这很优雅,但它不止一次对我有用。