Tôi đang làm việc trên một ứng dụng gia sư đánh máy cho Mac OSX cần phải có tổ hợp phím được chuyển tiếp đến nó, ngay cả khi ứng dụng không được lấy nét.OSX: Phát hiện các sự kiện keyDown trên toàn hệ thống?
Có cách nào để hệ thống chuyển tiếp các lần nhấn phím đến ứng dụng, có thể thông qua NSDistributedNotificationCenter không? Tôi đã googled bản thân mình ngớ ngẩn, và đã không thể tìm câu trả lời ...
EDIT:Mẫu mã dưới đây.
Cảm ơn @NSGod đã chỉ cho tôi đúng hướng - Tôi đã kết thúc việc thêm global events monitor bằng phương thức addGlobalMonitorForEventsMatchingMask: handler :, hoạt động tốt. Để hoàn chỉnh, thực hiện của tôi trông như thế này:
// register for keys throughout the device...
[NSEvent addGlobalMonitorForEventsMatchingMask:NSKeyDownMask
handler:^(NSEvent *event){
NSString *chars = [[event characters] lowercaseString];
unichar character = [chars characterAtIndex:0];
NSLog(@"keydown globally! Which key? This key: %c", character);
}];
Đối với tôi, phần khó khăn đã sử dụng khối, vì vậy tôi sẽ cung cấp cho một ít mô tả trong trường hợp nó giúp mọi người:
Những điều cần chú ý về ở trên mã là tất cả một phương thức gọi là trên NSEvent. Khối được cung cấp dưới dạng đối số, trực tiếp đến chức năng. Bạn có thể nghĩ nó giống như một phương thức đại biểu nội tuyến. Chỉ vì điều này đã mất một thời gian để chìm trong tôi, tôi sẽ làm việc qua từng bước ở đây:
[NSEvent addGlobalMonitorForEventsMatchingMask:NSKeyDownMask
Bit đầu tiên này không có vấn đề gì. Bạn đang gọi một phương thức lớp trên NSEvent, và nói cho nó biết sự kiện nào bạn muốn theo dõi, trong trường hợp này là NSKeyDownMask. Bạn có thể tìm thấy list of masks for supported event typeshere.
Bây giờ, chúng ta đến với một phần khó khăn: xử lý, mà hy vọng một khối:
handler:^(NSEvent *event){
Nó đã cho tôi một vài lỗi biên dịch để có được quyền này, nhưng (cảm ơn bạn Apple) họ đã lỗi rất mang tính xây dựng tin nhắn. Điều đầu tiên cần chú ý là carat ^. Điều đó báo hiệu sự bắt đầu của khối. Sau đó, trong các dấu ngoặc đơn,
NSEvent *event
Khai báo biến mà bạn sẽ sử dụng trong khối để nắm bắt sự kiện. Bạn có thể gọi nó là
NSEvent *someCustomNameForAnEvent
không quan trọng, bạn sẽ chỉ sử dụng tên đó trong khối. Sau đó, đó chỉ là về tất cả để có nó. Đảm bảo đóng ngoặc xoăn của bạn, và khung để kết thúc cuộc gọi phương pháp:
}];
Và bạn đã hoàn tất! Điều này thực sự là loại 'một lót'. Việc bạn thực hiện cuộc gọi này trong ứng dụng của bạn ở đâu không quan trọng - tôi làm điều đó trong phương thức applicationDidFinishLaunching của AppDelegate. Sau đó, trong khối, bạn có thể gọi các phương thức khác từ bên trong ứng dụng của mình.
Hey @Pirripli nhờ rất nhiều vì đã giải thích khối cú pháp cho tôi. REALLY giúp đỡ cho những người học tập! Hoạt động tuyệt vời bằng cách này :) – lab12
Không sao cả. ;) Tôi luôn biết ơn khi những người khác làm như vậy cho tôi, vì vậy tôi cố gắng giúp đỡ khi tôi có thể. –
Khi tôi thử khối mã này, tôi nhận được lỗi: 'Các kiểu con trỏ khối không tương thích gửi 'void (^) (struct NSEvent *)'' đến tham số kiểu void (^) (NSEvent *) 'trong khai báo - @Pirripli , Tôi đã quên thêm một cái gì đó? Bạn đã bao gồm một cái gì đó đặc biệt để hỗ trợ cú pháp khối? [Ảnh chụp màn hình] (https://img.skitch.com/20111024-tnmnka59j9fqn6u145g2jppk5d.png) – Tronathan