2010-06-19 54 views
2

我現在正在開發的項目基本上是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);都在那裏,因爲我讀的地方,系統菜單隻會工作的第一時間,除非我沒有將它帶到前臺的那招,但它仍然無法正常工作。

那麼有沒有人有任何想法如何讓這個工作正常?或者爲什麼它只在我重新啓動計算機後第一次運行?


剛剛測試過的東西,它也將再次顯示系統菜單中的窗口,如果我關閉窗口(例如,在退出程序),然後重新打開它。但再一次,它只會顯示一次,然後停止工作。

+0

鏈接到這個項目請:) – zproxy 2011-10-04 11:27:10

+0

是不是你應該檢查用戶在TrackPopupMenu中點擊了哪個項目,然後在WM_SYSCOMMAND中傳遞它,而不是發送WM_NULL? – EricLaw 2012-10-25 20:14:49

+0

沒有自定義系統菜單的應用程序的問題是[GetSystemMenu **創建**菜單](https://blogs.msdn.microsoft.com/oldnewthing/20100528-00/?p=13893),並且據我所知,將所有權分配給您的流程。當你的進程退出時,菜單被銷燬,但GetSystemMenu繼續返回相同的(現在無效的)菜單句柄。 Alt + Space仍然可以工作,大概是因爲窗口管理器回退到它自己的系統菜單的全局副本。 – Lexikos 2018-01-12 22:17:25

回答

0

它可能是hacky,但你有沒有嘗試設置窗口焦點,然後通過類似SendInput的方式發佈Alt + Space?

+0

這不會顯示系統菜單* [Paul]希望他們在何時何地*。 – 2010-06-19 06:38:06