2011-01-26 8 views
7

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!

+3

tại sao bolds ... Chúng tôi có thẻ cho rằng ;) – nacho4d

+4

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

+0

@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. –

Trả lời

10

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.

+1

Wowza ... Nó thậm chí có NSStrings như [hkm bind: @ "alt lệnh d" target: self action: @selector (show :)]; . =) –

4

Bạn sẽ muốn sử dụng các chức năng InstallApplicationEventHandlerRegisterEventHotKey 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).

7

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 ...

https://github.com/davedelong/DDHotKey

+1

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

+1

@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

+1

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

4

đâ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 
+0

Đã hoạt động hoàn hảo! – atomikpanda