Làm cách nào để đăng ký một phím nóng toàn cầu trong Objective-C/Cocoa (Mac)?Đăng ký Hotkey
Ví dụ, hotkey Tôi muốn đăng ký sẽ Alt - Cmd - D
Bất kỳ trợ giúp sẽ được đánh giá cao!
Làm cách nào để đăng ký một phím nóng toàn cầu trong Objective-C/Cocoa (Mac)?Đăng ký Hotkey
Ví dụ, hotkey Tôi muốn đăng ký sẽ Alt - Cmd - D
Bất kỳ trợ giúp sẽ được đánh giá cao!
Có trình bao bọc Cocoa tiện lợi cho các chức năng Carbon yêu cầu trên GitHub: JFHotkeyManager. Bạn cũng có thể sử dụng API NSEvent mới (từ 10.6) mới addGlobalMonitorForEventsMatchingMask:handler:
, nhưng nó chỉ nhận các sự kiện quan trọng nếu quyền truy cập cho các thiết bị trợ giúp được bật.
Wowza ... Nó thậm chí có NSStrings như [hkm bind: @ "alt lệnh d" target: self action: @selector (show :)]; . =) –
Bạn sẽ muốn sử dụng các chức năng InstallApplicationEventHandler
và RegisterEventHotKey
từ khung Carbon. Điều này blog post cho một cách khá tốt làm thế nào để (đó là những gì tôi được sử dụng khi tôi đã tìm ra công cụ này).
Tôi đã viết một lớp wrapper để làm điều này một heck của rất nhiều dễ dàng hơn ...
Bạn có thể giải thích các API bạn đã sử dụng trong mã đó không. Giống như tôi đang cố gắng sử dụng 'addGlobalMonitor' khi các thiết bị trợ giúp không được kích hoạt nhưng đang gặp khó khăn. 'CGEventTap' có phải là tùy chọn khi thiết bị trợ giúp không được bật không? – Noitidart
@Noitidart bạn đã tìm ra? Bởi vì tôi đã không. Tôi tự hỏi tại sao một người nào đó sẽ dành thời gian viết lên một wrapper tốt đẹp để làm cho một số nhiệm vụ một helluva dễ dàng hơn nhiều mà không giải thích làm thế nào để sử dụng nó. – user3496846
Hoàn toàn đồng ý với bạn @ user3496846 - Vâng tôi đã tìm ra, cả hai phương pháp CG và objc bị giới hạn bởi accessiblity, nếu bạn muốn đăng ký một phím nóng, bạn phải sử dụng phương thức Carbon RegisterHotKey - https://developer.apple.com /legacy/library/documentation/Carbon/Reference/CarbonFrameworkReference/index.html#//apple_ref/doc/uid/TP40004336 – Noitidart
đây bạn đi:
#import <Carbon/Carbon.h>
EventHandlerUPP hotKeyFunction;
pascal OSStatus hotKeyHandler(EventHandlerCallRef nextHandler,EventRef theEvent, void *userData)
{
FooBar *obj = userData;
[obj foo];
return noErr;
}
@implementation FooBar
- (id)init
{
self = [super init];
if (self) {
//handler
hotKeyFunction = NewEventHandlerUPP(hotKeyHandler);
EventTypeSpec eventType;
eventType.eventClass = kEventClassKeyboard;
eventType.eventKind = kEventHotKeyReleased;
InstallApplicationEventHandler(hotKeyFunction,1,&eventType,self,NULL);
//hotkey
UInt32 keyCode = 80; //F19
EventHotKeyRef theRef = NULL;
EventHotKeyID keyID;
keyID.signature = 'FOO '; //arbitrary string
keyID.id = 1;
RegisterEventHotKey(keyCode,0,keyID,GetApplicationEventTarget(),0,&theRef);
}
return self;
}
- (void)foo
{
}
@end
Đã hoạt động hoàn hảo! – atomikpanda
tại sao bolds ... Chúng tôi có thẻ cho rằng ;) – nacho4d
Hãy nhớ rằng sử dụng "alt-D" trên toàn cầu không phải là ý tưởng hay nhất vì nó thường tạo ra một ký tự hợp lệ (∂) và có thể đã được định nghĩa trong các ứng dụng khác (các khóa truy cập trong Safari là một ví dụ). Ngoài ra, người dùng Mac thông thường dự kiến có ít nhất "cmd" làm phím bổ trợ trong phím tắt. – Asmus
@Asmus: +1 và lý tưởng là "khóa nóng" cũng cần được định cấu hình người dùng. –