为什么 BringWindowToTop 结合 VCL 功能区不能正常工作?
Why does BringWindowToTop combined with the VCL Ribbon not work correctly?
我有以下(简化的)程序来将所需的 window 置于所有其他正常 windows 之上:
function focusWindow(): boolean;
var
h: Hwnd;
begin
result := true;
h := findwindow('Notepad', 'Unbenannt - Editor');
if h <> 0 then
BringWindowToTop(h);
end;
我在以下示例应用程序中使用它:
在顶部,您可以看到我的示例应用程序。后面有一个资源管理器window,背景是一个空的记事本。如上面的代码所示,我想将记事本 window 移到前面。
如果我从按钮事件处理程序调用我的函数
procedure TForm4.btnFocusClick(Sender: TObject);
begin
focusWindow();
end;
一切正常。空的记事本 window 移到前面,后面是示例应用程序,资源管理器在另外两个 windows.
后面
但是 如果我将 vcl 功能区控件与分配给命令按钮的操作一起使用,它只能部分工作。
procedure TForm4.actDemoExecute(Sender: TObject);
begin
focusWindow();
end;
记事本 window 向上移动,将资源管理器 window 留在后面。但是随后程序停止了——记事本 window 一直隐藏在我自己的应用程序后面。这里发生了什么?
我遇到过这样的情况,调用将某些东西带到顶部触发,然后某些东西(可能是某些控件上的 mouseUp,但我不确定)用按钮重新聚焦控件并放在前面。在这些我需要快速解决方法的情况下,添加一个在 10 或 20 毫秒内通过 bringToFront 调用触发的计时器似乎可行。按钮启动计时器,完成自己的处理,然后计时器执行 bringToFront 并自行关闭;这使得 BringToFront 在与按钮交互之后发生。我觉得这不是很优雅,但它不止一次为我工作。
我有以下(简化的)程序来将所需的 window 置于所有其他正常 windows 之上:
function focusWindow(): boolean;
var
h: Hwnd;
begin
result := true;
h := findwindow('Notepad', 'Unbenannt - Editor');
if h <> 0 then
BringWindowToTop(h);
end;
我在以下示例应用程序中使用它:
在顶部,您可以看到我的示例应用程序。后面有一个资源管理器window,背景是一个空的记事本。如上面的代码所示,我想将记事本 window 移到前面。
如果我从按钮事件处理程序调用我的函数
procedure TForm4.btnFocusClick(Sender: TObject);
begin
focusWindow();
end;
一切正常。空的记事本 window 移到前面,后面是示例应用程序,资源管理器在另外两个 windows.
后面但是 如果我将 vcl 功能区控件与分配给命令按钮的操作一起使用,它只能部分工作。
procedure TForm4.actDemoExecute(Sender: TObject);
begin
focusWindow();
end;
记事本 window 向上移动,将资源管理器 window 留在后面。但是随后程序停止了——记事本 window 一直隐藏在我自己的应用程序后面。这里发生了什么?
我遇到过这样的情况,调用将某些东西带到顶部触发,然后某些东西(可能是某些控件上的 mouseUp,但我不确定)用按钮重新聚焦控件并放在前面。在这些我需要快速解决方法的情况下,添加一个在 10 或 20 毫秒内通过 bringToFront 调用触发的计时器似乎可行。按钮启动计时器,完成自己的处理,然后计时器执行 bringToFront 并自行关闭;这使得 BringToFront 在与按钮交互之后发生。我觉得这不是很优雅,但它不止一次为我工作。