使用事件在Mac OS X上处理全局热键

时间:2016-01-17 01:05:06

标签: objective-c macos cocoa event-handling

我想要的是什么:

我正在运行一个程序。当程序在托盘中并且没有焦点时,我想设置几个全局快捷方式来向程序发送消息。 “发送消息”是什么意思?好吧,在我的程序中,我想要的只是访问一些标志,这将指示状态指定的密钥对(已启动或未启用)。我会在循环中轮询旗帜并从那里做出决定。

我找到了什么:

System-wide hotkey for an application

system wide shortcut for Mac OS X

我不明白的事情:

从上面的链接看起来我必须在注册热键时传递一个处理程序。在热键按下,OS调用处理程序。那对吗?我不明白的是,如果我的程序正在运行,系统会如何调用程序中的处理程序。

1 个答案:

答案 0 :(得分:2)

我认为你的主要问题是你不了解Mac编程是如何在目标C和Cocoa成为常态之前完成的。在此之前,大多数编程都是使用Carbon在C(或C ++)中完成的。此名称用于在Mac OS(Classic)和Mac OS X之间转换期间应该是更现代API集的“碳”副本的库。

您必须了解的另一件事是,您在上面给出的示例中给出的热键注册必须通过注册Carbon事件处理程序来配对,该事件处理程序将在您点击该热键组合时调用。

那就是说,我认为您应该阅读有关Carbon Event Manager的遗留文件:

https://developer.apple.com/legacy/library/documentation/Carbon/Conceptual/Carbon_Event_Manager/CarbonEvents.pdf

并特别注意碳事件应该如何注册。我特别使用:

public class Team
{
    public string Name { get; set; }
    public string Id { get; set; }
    public string Matches { get; set; }
}
  private ObservableCollection<Team> _teams=new ObservableCollection<Team>()
    {
        new Team()
        {
            Id="1",
            Matches = "45",
            Name = "TeamA"
        },
        new Team()
        {
            Id="1",
            Matches = "45",
            Name = "TeamB"
        },
        new Team()
        {
            Id="1",
            Matches = "45",
            Name = "TeamC"
        }
    };



    public ObservableCollection<Team> Teams
    {
        get
        {
            return _teams;
        }

        set
        {
            if (_teams == value)
            {
                return;
            }

            _teams = value;
            OnPropertyChanged();
        }
    }

我使用它的方式是我制作了一个客观的C包装器,其中我基本上执行以下操作:

这是类的一部分,我们称之为MyOwnEventHandler:

OSStatus  InstallEventHandler(EventTargetRef target,
                              EventHandlerUPP handlerProc,
                              UInt32 numTypes,
                              const EventTypeSpec* typeList,
                              void* userData,
                              EventHandlerRef* handlerRef);

我希望这会有所帮助。如果你被卡在某处让我知道,我会尽力帮助你。