2008-09-26 88 views
5

我需要列舉所有正在運行的應用程序。特別是,所有頂級窗口。對於每個窗口,我需要將自定義項目添加到該窗口的系統菜單中。如何將自定義項添加到C++的系統菜單中?

如何在C++中完成該操作?

更新。

我會非常樂意爲Windows,MacOS和Ubuntu提供解決方案(儘管我不確定MacOS和Ubuntu是否有'系統菜單'之類的東西)。

+0

什麼是目標操作系統 - Windows? – 2008-09-26 10:24:46

回答

1

一旦你有了另一個窗口的頂級手柄,你可以打電話給GetMenu()檢索窗口的系統菜單,然後修改它,比如:

HMENU hMenu = GetMenu(hwndNext); 
+0

我認爲你的意思是GetSystemMenu,而不是GetMenu;看到我的回覆。 – efotinis 2008-09-27 09:31:57

0

您可以使用EnumWindows()來枚舉頂級窗口。

對於問題的第二部分,我沒有具體的答案,但是如果您對窗口進行子類化,我想可以修改系統菜單。

編輯:或做克里斯說:調用使用getMenu()

0

回覆:更新 - 請注意,即使沒有微軟的Windows需要Windows有一個系統正菜單。 GetMenu()可能會返回0.您還需要攔截窗口創建,因爲每個新的頂層窗口都可能需要它。

此外,你提出的是對其他應用程序相當侵入。你如何確保在修改菜單時不會中斷?你將如何確保你壓制消息?特別是,你如何確保你在別人看到他們之前攔截他們?引用Raymond Chen的話,想象一下如果兩個程序會這樣做會發生什麼。

8

對於Windows,另一種方式來獲取頂級窗口(除了EnumWindows的,它採用了回調)是讓桌面的第一個孩子,然後檢索所有的兄弟姐妹:

HWND wnd = GetWindow(GetDesktopWindow(), GW_CHILD); 
while (wnd) { 
    // handle 'wnd' here 
    // ... 
    wnd = GetNextWindow(wnd, GW_HWNDNEXT); 
} 

至於獲取系統菜單,使用GetSystemMenu函數,並將FALSE作爲第二個參數。在其他答案中提到的GetMenu返回正常的窗口菜單。

但是,請注意,雖然將自定義菜單項添加到外部進程的窗口很容易,但對該項的選擇作出響應有點棘手。爲了能夠對窗口進行子類化,或者安裝全局鉤子(可能是WH_GETMESSAGEWH_CBT類型)來監視WM_SYSCOMMAND消息,您必須向流程注入一些代碼。

+0

你的回覆剛剛讓我的一天(實際上是晚上)!我從來沒有讀過關於WH_CBT的消息,看到你的帖子後,我現在可以從另一個進程中成功攔截(通過注入代碼)WM_SYSCOMMAND。 – foxx1337 2011-07-02 02:02:46

相關問題