有没有办法改变弹出菜单的位置。使用顶级窗口,我可以通过CBTProc回调函数和MoveWindow来完成。我可以用菜单做同样的事吗?需要这样做才能使弹出菜单仅位于其父窗口的区域中。像一个光窗口管理器。
答案 0 :(得分:1)
是的,在WH_CBT
钩子回调中,每当创建菜单窗口时,您都会收到{nCode'HCBT_CREATEWND
的通知。测试类名,标准菜单/子菜单窗口的类名称为“#32768”。然后,您可以向窗口发送MN_GETHMENU
消息,以找出即将激活的菜单。但是as documented,在收到通知时移动窗口为时尚早,菜单甚至还不可见,因此您可能需要对窗口进行子类化并处理其他消息。
请注意,当显示菜单窗口时,您不需要通知挂钩,您可以为WM_ENTERIDLE
消息设置处理程序,测试'wParam'以查看菜单是否导致消息,从'lParam'获取菜单窗口并再次发送'MN_GETHMENU'以找出特定菜单。此时可以移动窗口而无需进一步处理消息。请注意,'WM_ENTERIDLE'将被多次调用,因此您需要跟踪您是否已经移动了特定窗口。