gpt4 book ai didi

macos - 有没有办法知道主菜单的宽度?

转载 作者:行者123 更新时间:2023-12-03 17:54:17 24 4
gpt4 key购买 nike

我正在开发的应用程序需要能够否决菜单栏点击。单击菜单时有多种方法可以收到通知(主要是 NSMenu 通知和 NSMenu 委托(delegate)),但据我所知,没有一种方法会让你拒绝该操作。

我一直在考虑的解决方案是使用无边框透明窗口,并将其覆盖在菜单栏上。通过将窗口级别设置为足够高的值(在本例中为 NSStatusWindowLevel),它可以有效地定位并绘制在菜单栏上方,捕获本来会到达它的鼠标事件。这样,我就得到了我想要的东西。

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

有没有更好的方法来屏蔽菜单栏的事件,或者有没有办法找到它的宽度(不包括状态栏)?

这听起来可能很肮脏,确实如此。我正在为旧平台的应用程序级模拟器执行此操作,其中应用程序负责在用户单击菜单栏中时显示菜单,因此在发生这种情况时可以执行几乎任何操作。

最佳答案

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

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 ——也就是说,真正的主菜单后面。

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

为了获得额外的鲁棒性(只是为了确保光标或其他东西不被包含在内),请在相反的方向上执行相同的操作:在同一窗口级别上创建第二个窗口,order it front (在菜单和状态栏前面),并创建该窗口后面的窗口列表。

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

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

关于macos - 有没有办法知道主菜单的宽度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16254812/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com