我需要列舉所有正在運行的應用程序。特別是,所有頂級窗口。對於每個窗口,我需要將自定義項目添加到該窗口的系統菜單中。如何將自定義項添加到C++的系統菜單中?
如何在C++中完成該操作?
更新。
我會非常樂意爲Windows,MacOS和Ubuntu提供解決方案(儘管我不確定MacOS和Ubuntu是否有'系統菜單'之類的東西)。
我需要列舉所有正在運行的應用程序。特別是,所有頂級窗口。對於每個窗口,我需要將自定義項目添加到該窗口的系統菜單中。如何將自定義項添加到C++的系統菜單中?
如何在C++中完成該操作?
更新。
我會非常樂意爲Windows,MacOS和Ubuntu提供解決方案(儘管我不確定MacOS和Ubuntu是否有'系統菜單'之類的東西)。
回覆:更新 - 請注意,即使沒有微軟的Windows需要Windows有一個系統正菜單。 GetMenu()可能會返回0.您還需要攔截窗口創建,因爲每個新的頂層窗口都可能需要它。
此外,你提出的是對其他應用程序相當侵入。你如何確保在修改菜單時不會中斷?你將如何確保你壓制消息?特別是,你如何確保你在別人看到他們之前攔截他們?引用Raymond Chen的話,想象一下如果兩個程序會這樣做會發生什麼。
對於Windows,另一種方式來獲取頂級窗口(除了EnumWindows的,它採用了回調)是讓桌面的第一個孩子,然後檢索所有的兄弟姐妹:
HWND wnd = GetWindow(GetDesktopWindow(), GW_CHILD);
while (wnd) {
// handle 'wnd' here
// ...
wnd = GetNextWindow(wnd, GW_HWNDNEXT);
}
至於獲取系統菜單,使用GetSystemMenu
函數,並將FALSE作爲第二個參數。在其他答案中提到的GetMenu
返回正常的窗口菜單。
但是,請注意,雖然將自定義菜單項添加到外部進程的窗口很容易,但對該項的選擇作出響應有點棘手。爲了能夠對窗口進行子類化,或者安裝全局鉤子(可能是WH_GETMESSAGE
或WH_CBT
類型)來監視WM_SYSCOMMAND
消息,您必須向流程注入一些代碼。
你的回覆剛剛讓我的一天(實際上是晚上)!我從來沒有讀過關於WH_CBT的消息,看到你的帖子後,我現在可以從另一個進程中成功攔截(通過注入代碼)WM_SYSCOMMAND。 – foxx1337 2011-07-02 02:02:46
什麼是目標操作系統 - Windows? – 2008-09-26 10:24:46