我需要枚举所有正在运行的应用程序。特别是所有顶级窗口。对于每个窗口,我都需要将我的自定义项目添加到该窗口的系统菜单中。
我如何在 C++ 中完成它?
更新。
我非常乐意为 Windows、MacOS 和 Ubuntu 提供解决方案(尽管我不确定 MacOS 和 Ubuntu 是否有“系统菜单”之类的东西)。
最佳答案
对于 Windows,另一种获取顶级窗口的方法(除了使用回调的 EnumWindows 之外)是获取桌面的第一个子窗口,然后检索它的所有兄弟窗口:
HWND wnd = GetWindow(GetDesktopWindow(), GW_CHILD);
while (wnd) {
// handle 'wnd' here
// ...
wnd = GetNextWindow(wnd, GW_HWNDNEXT);
}
至于获取系统菜单,使用GetSystemMenu
函数,以 FALSE 作为第二个参数。 GetMenu
其他答案中提到的返回正常窗口菜单。
但是请注意,虽然向外部进程的窗口添加自定义菜单项很容易,但响应该项目的选择却有点棘手。您要么必须向进程中注入(inject)一些代码以便能够子类化窗口,要么安装全局 Hook (可能是 WH_GETMESSAGE
或 WH_CBT
类型)以监视 WM_SYSCOMMAND
消息。
关于c++ - 如何在 C++ 中将自定义项添加到系统菜单?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/138616/