我現在正在開發的項目基本上是Ultramon(多任務欄程序)的開源版本。因此,想象應用程序就像Windows任務欄一樣。每個窗口的按鈕等等。這是使用WinAPI編碼的C/C++從另一個窗口顯示系統菜單
我剛開始這樣做,並且具有一些功能。但是,我一直在獲取系統菜單(例如右鍵單擊任務欄上的按鈕時顯示的菜單),以顯示我希望他們何時何地。
我試圖使用方法:
HMENU menu = GetSystemMenu(item, false);
SetForegroundWindow(hWnd);
TrackPopupMenu(menu, TPM_LEFTALIGN | TPM_BOTTOMALIGN, 0, 0, 0, hWnd, NULL);
PostMessage(hWnd, WM_NULL, 0, 0);
產品的HWND我想要的菜單,hwnd是HWND的鍵/項目我希望菜單顯示的。 (現在顯示在0,0,我的主顯示器的左上角)。
這段代碼每次都可以完美地工作在一個定製的系統菜單上。例如:它不是隻是「恢復」,「最大化」等標準菜單,它有一些菜單項添加。這些菜單將始終顯示在我想要的位置。
但是,默認的基本系統菜單(例如僅具有最大化,還原,關閉等等的菜單)只會在我第一次使用它們時顯示。之後,他們拒絕出現。除非我重新啓動計算機,否則再次運行它,在這一點上它們完美地工作。
注:SetForegroundWindow(hWnd);
和PostMessage(hWnd, WM_NULL, 0, 0);
都在那裏,因爲我讀的地方,系統菜單隻會工作的第一時間,除非我沒有將它帶到前臺的那招,但它仍然無法正常工作。
那麼有沒有人有任何想法如何讓這個工作正常?或者爲什麼它只在我重新啓動計算機後第一次運行?
剛剛測試過的東西,它也將再次顯示系統菜單中的窗口,如果我關閉窗口(例如,在退出程序),然後重新打開它。但再一次,它只會顯示一次,然後停止工作。
鏈接到這個項目請:) – zproxy 2011-10-04 11:27:10
是不是你應該檢查用戶在TrackPopupMenu中點擊了哪個項目,然後在WM_SYSCOMMAND中傳遞它,而不是發送WM_NULL? – EricLaw 2012-10-25 20:14:49
沒有自定義系統菜單的應用程序的問題是[GetSystemMenu **創建**菜單](https://blogs.msdn.microsoft.com/oldnewthing/20100528-00/?p=13893),並且據我所知,將所有權分配給您的流程。當你的進程退出時,菜單被銷燬,但GetSystemMenu繼續返回相同的(現在無效的)菜單句柄。 Alt + Space仍然可以工作,大概是因爲窗口管理器回退到它自己的系統菜單的全局副本。 – Lexikos 2018-01-12 22:17:25