【发布时间】:2020-10-21 22:39:23
【问题描述】:
我创建了一个没有标题/标题栏的自定义窗口。我在自定义菜单栏中添加了一个系统菜单图标/按钮。这是处理来自该按钮的命令的代码,我尝试访问系统菜单:
case ID_MENUBAR_SYS:
HMENU hSysMenu = GetSystemMenu(hWnd, FALSE);
TrackPopupMenu(hSysMenu, TPM_LEFTALIGN | TPM_TOPALIGN | TPM_LEFTBUTTON, 0, cyMenu, 0, hWnd, NULL);
按钮起作用,并显示系统菜单。但是,没有任何菜单项处于活动状态。我只是听到哔哔声,表示命令无效。假设GetSystemMenu() 只返回一个副本。如何访问到实际的系统菜单?
作为临时措施,我使用SendInput()模拟Alt + Space。虽然这样可行,但实现需要一堆丑陋的代码。另外,这似乎是一种过于暴力的方法。
另外一个问题,为什么TrackPopupMenu() 使用屏幕坐标,而不是窗口坐标?我需要设置一个标志吗?
【问题讨论】:
-
当您说菜单项处于非活动状态时,您的意思是它们被禁用/重影吗?或者你可以选择它们吗?
TrackPopupMenu()使用屏幕坐标,因为它……就是这样。您可以使用ClientToScreen()从客户端坐标转换。