2010-06-19 66 views
2

我现在正在开发的项目基本上是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);都在那里,因为我读的地方,系统菜单只会工作的第一时间,除非我没有将它带到前台的那招,但它仍然无法正常工作。

那么有没有人有任何想法如何让这个工作正常?或者为什么它只在我重新启动计算机后第一次运行?


刚刚测试过的东西,它也将再次显示系统菜单中的窗口,如果我关闭窗口(例如,在退出程序),然后重新打开它。但再一次,它只会显示一次,然后停止工作。

+0

链接到这个项目请:) – zproxy 2011-10-04 11:27:10

+0

是不是你应该检查用户在TrackPopupMenu中点击了哪个项目,然后在WM_SYSCOMMAND中传递它,而不是发送WM_NULL? – EricLaw 2012-10-25 20:14:49

+0

没有自定义系统菜单的应用程序的问题是[GetSystemMenu **创建**菜单](https://blogs.msdn.microsoft.com/oldnewthing/20100528-00/?p=13893),并且据我所知,将所有权分配给您的流程。当你的进程退出时,菜单被销毁,但GetSystemMenu继续返回相同的(现在无效的)菜单句柄。 Alt + Space仍然可以工作,大概是因为窗口管理器回退到它自己的系统菜单的全局副本。 – Lexikos 2018-01-12 22:17:25

回答

0

它可能是hacky,但你有没有尝试设置窗口焦点,然后通过类似SendInput的方式发布Alt + Space?

+0

这不会显示系统菜单* [Paul]希望他们在何时何地*。 – 2010-06-19 06:38:06

相关问题