我需要列举所有正在运行的应用程序。特别是,所有顶级窗口。对于每个窗口,我需要将自定义项目添加到该窗口的系统菜单中。如何将自定义项添加到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