2017-04-05 64 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'也應該這樣做,可以說更加優雅。還沒有嘗試過。 –