2008-09-26 91 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

相关问题