2017-04-05 68 views
0

我有以下(简化的)过程,使所期望的窗口之上的所有其它正常窗口:为什么BringWindowToTop与VCL Ribbon结合不能正常工作?

function focusWindow(): boolean; 
var 
    h: Hwnd; 
begin 
    result := true; 
    h := findwindow('Notepad', 'Unbenannt - Editor'); 
    if h <> 0 then 
    BringWindowToTop(h); 
end; 

我在下面的例子中应用程序中使用此:

starting situation

在顶部,你可以看到我的示例应用程序。后面有一个资源管理器窗口,后面还有一个空的记事本。如上面的代码所示,我想将记事本窗口移到前面。

如果我把我的函数从按钮的事件处理程序

procedure TForm4.btnFocusClick(Sender: TObject); 
begin 
    focusWindow(); 
end; 

一切正常。空白的记事本窗口向前移动,后面是示例应用程序,浏览器位于其他两个窗口的后面。

但是如果我使用vcl功能区控件并将操作分配给一个命令按钮,它只能部分工作。

procedure TForm4.actDemoExecute(Sender: TObject); 
begin 
    focusWindow(); 
end; 

记事本窗口向上移动,离开浏览器窗口后面。但是,程序停止 - 记事本窗口隐藏在我自己的应用程序后面。这里发生了什么?

final situation

+0

我试过用Windows 10和Delphi 10.1柏林,它适用于我的两种方式。 – EugeneK

+0

谢谢你重试它。我无法告诉您更多关于我的环境的信息,我也在使用Windows 10,版本1607.您是否在操作管理器中使用了操作?因为我怀疑导致此行为的动作的内置更新机制。 – ventiseis

+1

是的,我只用一个动作就使用了Ribbon和ActionManager。 – EugeneK

回答

1

我有背景,那里电话带来些什么顶端发射且接着东西(也许是鼠标松开某些控制,但我不知道)重新调整与按钮并使控制前面。在这些情况下,我需要一个快速的解决方法,添加一个计时器,在10到20毫秒内触发bringToFront似乎工作。该按钮启动计时器,完成它自己的处理,然后计时器执行bringToFront并将其自动关闭;这使得BringToFront在与按钮交互之后发生。我不觉得这很优雅,但它不止一次地为我工作。

+1

'PostMessage'也应该这样做,可以说更加优雅。还没有尝试过。 –