有没有办法告诉MainMenu的宽度?

时间:2013-04-27 17:10:12

标签: macos cocoa

我正在开发的应用程序需要能够否决菜单栏点击次数。有很多方法可以通知您何时点击菜单(主要是NSMenu通知和NSMenu委托),但据我所知,他们都不会让您拒绝操作

我一直在考虑的解决方案是使用无边框和透明窗口,并将其覆盖在菜单栏上。通过将窗口级别设置为足够高的值(在这种情况下为NSStatusWindowLevel),它可以有效地定位并绘制在菜单栏上方,捕获原本可以进入的鼠标事件。这样,我就有了我正在寻找的东西。

该解决方案的问题在于它还会屏蔽状态栏的事件(右对齐的全局菜单项),我不需要或不想要否决这些事件。要解决这个问题,我需要能够告诉状态栏的跨度或菜单栏的跨度,但我发现没有明显的方法。 NSApp.mainMenu.size返回主菜单的大小,好像它是在弹出菜单中布局的,这显然不是我需要的。

有没有更好的方法将事件屏蔽到菜单栏,或者有没有办法找到除状态栏之外的宽度?

这可能听起来都很脏,而且确实很脏。我正在为旧平台的应用程序级模拟器执行此操作,其中应用程序负责在用户单击菜单栏时显示菜单,因此在发生这种情况时可以执行它想要的任何操作。 < / p>

1 个答案:

答案 0 :(得分:1)

菜单栏的宽度很简单:它是菜单栏屏幕的宽度。这包括所有应用程序的菜单:

Screenshot of the menu bar, all the way across the screen, with the menus included.

那是来自Layers,所以我认为你不能在自己的应用中做得更好。

因此,您将不得不减去状态栏。

使用Quartz Window Services非常简单。

首先,在the main menu window level上创建一个无边框,不透明,背景清晰的空窗口,然后order it back - 即隐藏真正的主菜单。< / p>

然后,获取窗口的窗口编号,并将其传递给the CGWindowListCreate function,指定您希望所有窗口位于之外的其他窗口。

为了获得额外的稳健性(只是为了确保光标或其他内容不被包含),在相反的方向做同样的事情:在同一窗口级别order it front创建第二个窗口(在前面菜单和状态栏),并创建窗口后面的窗口列表。

两个阵列中的窗口都是菜单栏和所有状态项。宽度是主菜单屏幕([NSScreen screens][0])的宽度是菜单栏; union将所有状态项的矩形放在一起,并将菜单栏的矩形切割为状态项矩形的原点。

请注意,所有这些都假定菜单栏和状态项以某种方式组织,在任何操作系统更新中都可能会发生变化。

相关问题