【问题标题】:Show System Menu From Another Window从另一个窗口显示系统菜单
【发布时间】:2011-03-05 15:59:33
【问题描述】:

我现在正在进行的项目本质上是 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);

item 是我想要菜单的 HWND,hWnd 是我想要菜单显示的按钮/项目的 HWND。 (它现在显示在 0, 0,我的主显示器的左上角)。

对于自定义的系统菜单,此代码每次都能完美运行。例如:它不是“恢复”、“最大化”等的标准菜单,它在菜单项中添加了一些。这些菜单将始终显示在我想要的位置。

但是,默认的基本系统菜单(例如,只有最大化、恢复、关闭等的菜单)只会在我第一次使用时显示。之后,他们拒绝出现。除非我重新启动计算机,否则再次运行它,此时它们可以完美运行。

注意:SetForegroundWindow(hWnd);PostMessage(hWnd, WM_NULL, 0, 0); 在那里,因为我在某处读到系统菜单只能在第一次工作,除非我把它带到前台,但它仍然不能正常工作。

那么有没有人知道如何让它正常工作?或者为什么它只在我重新启动计算机后第一次起作用?


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

【问题讨论】:

  • 请链接到这个项目:)
  • 难道不应该在TrackPopupMenu中检查用户点击了哪个项目,然后在WM_SYSCOMMAND中传递,而不是发送WM_NULL?
  • 没有自定义系统菜单的应用程序的问题是GetSystemMenu creates the menu,据我所知,它将所有权分配给您的进程。当您的进程退出时,菜单被销毁,但 GetSystemMenu 继续返回相同的(现在无效的)菜单句柄。 Alt+Space 仍然可以工作,大概是因为窗口管理器回退到它自己的系统菜单的全局副本。

标签: c++ winapi menu


【解决方案1】:

这可能很麻烦,但是您是否尝试过设置窗口焦点,然后通过 SendInput 之类的方式发出 Alt+Space?

【讨论】:

  • 这不会显示系统菜单[Paul] 何时何地希望他们显示
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-03
  • 1970-01-01
  • 2012-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多