我现在正在开发的项目基本上是Ultramon(多任务栏程序)的开源版本。因此,想象应用程序就像Windows任务栏一样。每个窗口的按钮等等。这是使用WinAPI编码的C/C++从另一个窗口显示系统菜单
我刚开始这样做,并且具有一些功能。但是,我一直在获取系统菜单(例如右键单击任务栏上的按钮时显示的菜单),以显示我希望他们何时何地。
我试图使用方法:
HMENU menu = GetSystemMenu(item, false);
SetForegroundWindow(hWnd);
TrackPopupMenu(menu, TPM_LEFTALIGN | TPM_BOTTOMALIGN, 0, 0, 0, hWnd, NULL);
PostMessage(hWnd, WM_NULL, 0, 0);
产品的HWND我想要的菜单,hwnd是HWND的键/项目我希望菜单显示的。 (现在显示在0,0,我的主显示器的左上角)。
这段代码每次都可以完美地工作在一个定制的系统菜单上。例如:它不是只是“恢复”,“最大化”等标准菜单,它有一些菜单项添加。这些菜单将始终显示在我想要的位置。
但是,默认的基本系统菜单(例如仅具有最大化,还原,关闭等等的菜单)只会在我第一次使用它们时显示。之后,他们拒绝出现。除非我重新启动计算机,否则再次运行它,在这一点上它们完美地工作。
注:SetForegroundWindow(hWnd);
和PostMessage(hWnd, WM_NULL, 0, 0);
都在那里,因为我读的地方,系统菜单只会工作的第一时间,除非我没有将它带到前台的那招,但它仍然无法正常工作。
那么有没有人有任何想法如何让这个工作正常?或者为什么它只在我重新启动计算机后第一次运行?
刚刚测试过的东西,它也将再次显示系统菜单中的窗口,如果我关闭窗口(例如,在退出程序),然后重新打开它。但再一次,它只会显示一次,然后停止工作。
链接到这个项目请:) – zproxy 2011-10-04 11:27:10
是不是你应该检查用户在TrackPopupMenu中点击了哪个项目,然后在WM_SYSCOMMAND中传递它,而不是发送WM_NULL? – EricLaw 2012-10-25 20:14:49
没有自定义系统菜单的应用程序的问题是[GetSystemMenu **创建**菜单](https://blogs.msdn.microsoft.com/oldnewthing/20100528-00/?p=13893),并且据我所知,将所有权分配给您的流程。当你的进程退出时,菜单被销毁,但GetSystemMenu继续返回相同的(现在无效的)菜单句柄。 Alt + Space仍然可以工作,大概是因为窗口管理器回退到它自己的系统菜单的全局副本。 – Lexikos 2018-01-12 22:17:25