- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发的应用程序需要能够否决菜单栏点击。单击菜单时有多种方法可以收到通知(主要是 NSMenu
通知和 NSMenu
委托(delegate)),但据我所知,没有一种方法会让你拒绝该操作。
我一直在考虑的解决方案是使用无边框透明窗口,并将其覆盖在菜单栏上。通过将窗口级别设置为足够高的值(在本例中为 NSStatusWindowLevel
),它可以有效地定位并绘制在菜单栏上方,捕获本来会到达它的鼠标事件。这样,我就得到了我想要的东西。
该解决方案的问题在于,它还屏蔽了状态栏的事件(右对齐的全局菜单项),而我不需要或不想否决这些事件。为了解决这个问题,我需要能够告诉状态栏的跨度或菜单栏的跨度,但我没有找到明显的方法。 NSApp.mainMenu.size
返回主菜单的大小,就像在弹出菜单中布局一样,这显然不是我需要的。
有没有更好的方法来屏蔽菜单栏的事件,或者有没有办法找到它的宽度(不包括状态栏)?
这听起来可能很肮脏,确实如此。我正在为旧平台的应用程序级模拟器执行此操作,其中应用程序负责在用户单击菜单栏中时显示菜单,因此在发生这种情况时可以执行几乎任何操作。
最佳答案
菜单栏的宽度很简单:它是菜单栏屏幕的宽度。这包括应用程序的所有菜单:
来自 Layers ,所以我认为您无法在您的应用中做得更好。
因此,您必须减去状态栏。
使用 Quartz Window Services 这很容易。
首先,在 the main menu window level 上创建一个无边框、非不透明、背景清晰的空窗口。然后order it back ——也就是说,在真正的主菜单后面。
然后,获取您的窗口的窗口号,并将其传递给 the CGWindowListCreate
function ,指定您希望所有窗口都位于其他窗口之上。
为了获得额外的鲁棒性(只是为了确保光标或其他东西不被包含在内),请在相反的方向上执行相同的操作:在同一窗口级别上创建第二个窗口,order it front (在菜单和状态栏前面),并创建该窗口后面的窗口列表。
两个数组中的窗口都是菜单栏和所有状态项。宽度为主菜单屏幕([NSScreen Screens][0]
)的宽度为菜单栏; union将所有状态项的矩形放在一起,并将菜单栏的矩形剪切到状态项矩形的原点。
请注意,所有这些都假设菜单栏和状态项以某种方式组织,这可能会在任何操作系统更新中发生变化。
关于macos - 有没有办法知道主菜单的宽度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16254812/
我是一名优秀的程序员,十分优秀!