我想從另一個應用程序獲取菜單項。在C++中找到基於鼠標位置的菜單項
我可以通過手動獲取主菜單的句柄,並通過其子菜單循環來做到這一點。但是很難找出給定菜單有多少個子菜單。例如,如果我們查看Outlook視圖菜單,可以查看 - >排列方式 - >當前視圖 - >消息。
所以我決定得到基於鼠標位置的菜單項。但我找不到一種方法來做到這一點。
請推薦一些想法來做到這一點。
我想從另一個應用程序獲取菜單項。在C++中找到基於鼠標位置的菜單項
我可以通過手動獲取主菜單的句柄,並通過其子菜單循環來做到這一點。但是很難找出給定菜單有多少個子菜單。例如,如果我們查看Outlook視圖菜單,可以查看 - >排列方式 - >當前視圖 - >消息。
所以我決定得到基於鼠標位置的菜單項。但我找不到一種方法來做到這一點。
請推薦一些想法來做到這一點。
我懷疑你試圖實現的功能或多或少因爲windows的菜單系統的設計而變得不可能。
請注意,這可能存在一些非常規的方法,但是我懷疑你會發現這樣的解決方案比當前的遍歷菜單層次結構的策略運行更少的工作量。
事情是,菜單和子菜單層次實際上是一個常規菜單樹。在MFC中,您有一棵CMenu對象樹,在win32 C api中,它是一棵HMENU手柄樹。
每個菜單,無論它是子菜單還是主菜單,都有一些本身不是對象的項目。即沒有稱爲CMenuItem的MFC類,也沒有稱爲HMENUITEM的win32 API句柄類型。如果你看看處理菜單的任何函數,它總是傳遞一個菜單項的ID。例如看看CMenu::EnableMenuItem或CMenu::GetDefaultItem。
現在,真正的問題是由兩個事實組成 - 菜單項對於它們所在的菜單是本地的。如果您查看C API中的任何函數,則始終需要指定菜單句柄和菜單項ID,因爲物品ID無法解析,除非框架知道你正在談論哪個菜單對象。因此,ID不是全球性的。在MFC中,通常不需要指定菜單句柄,但這是因爲CMenu對象本身包裝了HMENU句柄。
問題的第二部分是沒有從位置檢索菜單(CMenu或HMENU)的自然方法。您可以從位置到MenuItemFromPoint獲得菜單項,但正如您所看到的,您還需要菜單句柄,並且返回的ID僅在與指定的菜單句柄結合使用時纔有效。由於除了遍歷子菜單層次之外,您無法獲得該菜單句柄 - 所以您已經回到了原點。作爲最後一點 - Visual C++菜單(CMenu)的功能總是侷限於Win32 C API menu functions的功能,所以任何沒有找到的功能或多或少都不可及。
感謝您分享您的觀點。我將致力於改進目前的遍歷菜單層次結構的方法,以便我可以獲得更好的結果。 – Prasad 2011-06-08 04:20:29