gpt4 book ai didi

objective-c - 使用事件来处理 Mac OS X 上的全局热键

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

我想要什么:

我有一个程序正在运行。当程序位于托盘中且失去焦点时,我希望设置几个全局快捷方式来向程序发送消息。 “发送消息”是什么意思?好吧,在我的程序中,我想要的只是访问某个标志,该标志将指示指定 key 对的状态(是否已触发)。我会轮询循环中的标志并从那里做出决定。

我发现了什么:

System-wide hotkey for an application

system wide shortcut for Mac OS X

我不明白的地方:

从上面的链接看来,我在注册热键时必须传递一个处理程序。按下热键时,操作系统会调用处理程序。是这样吗?我不明白的是,如果我的程序正在运行,系统到底如何调用我的程序内的处理程序。

最佳答案

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

您必须了解的另一件事是,上面示例中给出的热键注册必须与 Carbon 事件处理程序的注册配对,当您按下该热键组合时将调用该处理程序。

也就是说,我认为您应该阅读这份有关 Carbon 事件管理器的旧文档:

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

并特别注意 Carbon 事件的注册方式。我特别使用:

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

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

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

- (EventHandlerRef)handlerRef {

if ( handlerRef == nil ) {
NSAssert( InstallEventHandler(GetApplicationEventTarget(),
&EventHandler,
0,
nil,
self,
&handlerRef ) == noErr, @"handlerRef" );
}

return handlerRef;
}

// this is a Carbon callback that the OS invokes when your app gets
// a hotkey event that must be handled by you
OSStatus EventHandler( EventHandlerCallRef inHandler,
EventRef inEvent,
void* inUserData )
{
EventHotKeyID hotKeyID;
GetEventParameter( inEvent,
kEventParamDirectObject,
typeEventHotKeyID,
nil,
sizeof(EventHotKeyID),
nil,
&hotKeyID );

// use this to get your MyOwnEventHandler object back if need be
// the reason why we get this is because we passed self in InstallEventHandler
// in Carbon event callbacks you cannot access self directly
// because this is a C callback, not an objective C method
MyOwnEventHandler* handler = (MyOwnEventHandler *)inUserData;

// handle the hotkey here - I usually store the id of the EventHotKeyID struct
// in a objective C hotkey object to look up events in an array of registered hotkeys

return eventNotHandledErr; // return this error for other handlers to handle this event as well
}

// call this objective C wrapper method to register your Carbon Event handler
- (void)registerForGettingHotKeyEvents {
const EventTypeSpec kHotKeysEvent[] = {{ kEventClassKeyboard, kEventHotKeyPressed }};
AddEventTypesToHandler( [self handlerRef], GetEventTypeCount(kHotKeysEvent), kHotKeysEvent );
}

// call this objective C wrapper method to unregister your Carbon Event handler
- (void)unregisterFromGettingHotKeyEvents {
const EventTypeSpec kHotKeysEvent[] = {{ kEventClassKeyboard, kEventHotKeyPressed }};
RemoveEventTypesFromHandler( [self handlerRef], GetEventTypeCount(kHotKeysEvent), kHotKeysEvent );
}

我希望这有帮助。如果您遇到困难,请告诉我,我会尽力帮助您。

关于objective-c - 使用事件来处理 Mac OS X 上的全局热键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34833975/

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