2010-05-20 42 views
2

正常情況下,當創建子窗口(WS_POPUP)時,子窗口將變爲激活狀態,父項將變爲停用狀態。但是,對於菜單,兩者都保持活動狀態。至少我假設菜單是活躍的,它至少有焦點。是否可以創建一個不會使父項失活的子窗口?

示例:單擊記事本中的文件菜單,出現菜單,但記事本窗口仍然看起來活躍。

是否有可能將此行爲與窗口樣式或響應特定消息進行映射?

感謝

又如:組合框似乎表明一個子窗口,但不要關閉該窗口。您可以點擊該子窗口,同時仍然保持激活的主窗口。關於如何獲取該窗口的類/樣式的任何想法?

+0

OSK.EXE(屏幕鍵盤)可以做到這一點 - 雖然在全球範圍內 - 你可以通過間諜++ – 2010-05-20 21:27:48

+0

捅一下它絕對是那樣的想法。但是,當我嘗試它,似乎它只是繼續激活前一個窗口(即:頂部窗口仍然失去激活略)。 我想創造一種感覺就像一個菜單(但看起來完全不同)的東西,甚至一時激活損失的感覺錯誤。 – Bob 2010-05-20 21:41:41

回答

3

在組合框中的列表下拉列表有點破解,它既是一個彈出窗口,也是一個子窗口,我不能推薦這種方法(未記錄的樣式組合和IIRC,這樣做有點bug用「正常」的浮動窗口/工具欄)

這使你有兩個選擇:

  • WS_EX_NOACTIVATE(主窗口將保持活躍,浮動窗口未激活)
  • Handle activate messages(這兩個窗口的外觀活躍)
+0

您的鏈接看起來很有吸引力。我昨天晚上想着要走下工具窗口的方法,但沒有意識到他們的激活並不是免費的。 – Bob 2010-05-21 18:42:50

+0

您的鏈接正是我所需要的。非常感謝你。 – Bob 2010-05-25 20:29:54

+0

鏈接已移至:http://www.catch22.net/tuts/docking-toolbars-part-1 – 2015-01-30 15:31:23

0

我很驚訝創建一個新的彈出窗口激活它。通常你需要撥打SetActiveWindow。但請查看WM_ACTIVATEWM_NCACTIVATE,瞭解如何停止窗口變爲停用狀態。

+0

最有可能做的是SW_SHOW,而不是SW_SHOWNOACTIVATE。但是,如果你不介意的話,我還有其他一些問題。如果您可以在未激活的窗口中進行對焦,您是否知道離手(即:如果用戶開始使用鍵盤,我想要上下按照正常菜單中的方式工作)?或者,如果您可以禁止點擊激活? – Bob 2010-05-20 22:39:36

+0

我不能說我已經做到了這一點,但我對這個結果感興趣。嘗試使用Spy ++並在顯示菜單時檢查消息。 – 2010-05-20 23:54:02

0

很多人錯過的一個事實是,windows沒有單獨的窗口管理器組件: - 大多數窗口管理任務都由每個窗口執行 - 通常在DefWindowProc中執行。

大多數窗口定位和激活/去激活都是通過調用SetWindowPos來完成的,它總是發送一個WM_WINDOWPOSCHANGING消息,允許窗口對所發生的事情有最終的發言權。

DefWindowProc還響應鼠標點擊等激活自己的窗口。

所有這些的結果是,很可能創建從不接受激活的窗口 - 它確實需要對什麼消息和情況可能導致激活有廣泛的理解。

最終我可以說,爲遠程調試配置一個調試設置非常方便 - 這樣您就可以在不影響系統激活狀態的情況下與調試器進行交互 - 從而在問題窗口中放置一個斷點WM_ACTIVATE處理程序,並簡單地調試導致不需要的激活的任何情況。

如果你也想處理鍵盤焦點,它可能會更棘手 - 通常焦點被賦予一個激活的窗口 - 但它通常是負責分配兩者的DefWindowProc。我看到它有危險,因爲有一個窗口,仍然明顯激活,另一個焦點。這會很大程度上混淆任何輔助軟件。

我會試圖執行消息循環級消息掛鉤 - 類似於IsDialogMessage - 來過濾用於彈出窗口的擊鍵。

0

如果使用WS_EX_NOACTIVATE創建彈出窗口,它將不會被用戶輸入激活(您仍然可以以編程方式激活它),因此您的主應用程序窗口仍然保持活動狀態。

相關問題