正常情況下,當創建子窗口(WS_POPUP)時,子窗口將變爲激活狀態,父項將變爲停用狀態。但是,對於菜單,兩者都保持活動狀態。至少我假設菜單是活躍的,它至少有焦點。是否可以創建一個不會使父項失活的子窗口?
示例:單擊記事本中的文件菜單,出現菜單,但記事本窗口仍然看起來活躍。
是否有可能將此行爲與窗口樣式或響應特定消息進行映射?
感謝
又如:組合框似乎表明一個子窗口,但不要關閉該窗口。您可以點擊該子窗口,同時仍然保持激活的主窗口。關於如何獲取該窗口的類/樣式的任何想法?
正常情況下,當創建子窗口(WS_POPUP)時,子窗口將變爲激活狀態,父項將變爲停用狀態。但是,對於菜單,兩者都保持活動狀態。至少我假設菜單是活躍的,它至少有焦點。是否可以創建一個不會使父項失活的子窗口?
示例:單擊記事本中的文件菜單,出現菜單,但記事本窗口仍然看起來活躍。
是否有可能將此行爲與窗口樣式或響應特定消息進行映射?
感謝
又如:組合框似乎表明一個子窗口,但不要關閉該窗口。您可以點擊該子窗口,同時仍然保持激活的主窗口。關於如何獲取該窗口的類/樣式的任何想法?
在組合框中的列表下拉列表有點破解,它既是一個彈出窗口,也是一個子窗口,我不能推薦這種方法(未記錄的樣式組合和IIRC,這樣做有點bug用「正常」的浮動窗口/工具欄)
這使你有兩個選擇:
我很驚訝創建一個新的彈出窗口激活它。通常你需要撥打SetActiveWindow。但請查看WM_ACTIVATE和WM_NCACTIVATE,瞭解如何停止窗口變爲停用狀態。
最有可能做的是SW_SHOW,而不是SW_SHOWNOACTIVATE。但是,如果你不介意的話,我還有其他一些問題。如果您可以在未激活的窗口中進行對焦,您是否知道離手(即:如果用戶開始使用鍵盤,我想要上下按照正常菜單中的方式工作)?或者,如果您可以禁止點擊激活? – Bob 2010-05-20 22:39:36
我不能說我已經做到了這一點,但我對這個結果感興趣。嘗試使用Spy ++並在顯示菜單時檢查消息。 – 2010-05-20 23:54:02
很多人錯過的一個事實是,windows沒有單獨的窗口管理器組件: - 大多數窗口管理任務都由每個窗口執行 - 通常在DefWindowProc中執行。
大多數窗口定位和激活/去激活都是通過調用SetWindowPos來完成的,它總是發送一個WM_WINDOWPOSCHANGING消息,允許窗口對所發生的事情有最終的發言權。
DefWindowProc還響應鼠標點擊等激活自己的窗口。
所有這些的結果是,很可能創建從不接受激活的窗口 - 它確實需要對什麼消息和情況可能導致激活有廣泛的理解。
最終我可以說,爲遠程調試配置一個調試設置非常方便 - 這樣您就可以在不影響系統激活狀態的情況下與調試器進行交互 - 從而在問題窗口中放置一個斷點WM_ACTIVATE處理程序,並簡單地調試導致不需要的激活的任何情況。
如果你也想處理鍵盤焦點,它可能會更棘手 - 通常焦點被賦予一個激活的窗口 - 但它通常是負責分配兩者的DefWindowProc。我看到它有危險,因爲有一個窗口,仍然明顯激活,另一個焦點。這會很大程度上混淆任何輔助軟件。
我會試圖執行消息循環級消息掛鉤 - 類似於IsDialogMessage - 來過濾用於彈出窗口的擊鍵。
如果使用WS_EX_NOACTIVATE創建彈出窗口,它將不會被用戶輸入激活(您仍然可以以編程方式激活它),因此您的主應用程序窗口仍然保持活動狀態。
OSK.EXE(屏幕鍵盤)可以做到這一點 - 雖然在全球範圍內 - 你可以通過間諜++ – 2010-05-20 21:27:48
捅一下它絕對是那樣的想法。但是,當我嘗試它,似乎它只是繼續激活前一個窗口(即:頂部窗口仍然失去激活略)。 我想創造一種感覺就像一個菜單(但看起來完全不同)的東西,甚至一時激活損失的感覺錯誤。 – Bob 2010-05-20 21:41:41