c++ - 如何在 C++ 中将自定义项添加到系统菜单?

标签 c++ enumeration

我需要枚举所有正在运行的应用程序。特别是所有顶级窗口。对于每个窗口,我都需要将我的自定义项目添加到该窗口的系统菜单中。

我如何在 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_GETMESSAGEWH_CBT 类型)以监视 WM_SYSCOMMAND 消息。

关于c++ - 如何在 C++ 中将自定义项添加到系统菜单?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/138616/

相关文章:

c++ - 多个 ASIO io_services 是好事吗?

c++ - QAbstractTableModel编辑而不清除单元格中的先前数据

enumeration - Elixir - 循环并添加到 map

web-services - 使用 ColdFusion 的 .net Web 服务时出现问题

ios - 替换 NSMutableArray 中出现的字符串只工作一次

c++ - 应该使用什么优雅的方法回调设计?

c++ - 用C++写一个代理类

c++ - LDSET ARM 指令作为内联汇编

java - 枚举上的 JSTL foreach

enums - 系统Verilog : How come the enum next() method cannot be used in a constant function?