Tôi đang sử dụng một số mã Carbon trong dự án Cocoa của mình để xử lý các sự kiện quan trọng trên toàn cầu (các phím tắt) từ các ứng dụng khác. Hiện tại tôi đã thiết lập trình xử lý sự kiện kEventHotKeyReleased
và tôi có thể nhận được các phím nóng khi ứng dụng của tôi không hoạt động. Điều đó kích hoạt một số hoạt động trong ứng dụng của tôi.Làm thế nào để theo dõi trạng thái khóa bổ trợ toàn cục (trong bất kỳ ứng dụng nào)?
Tôi có vấn đề với hành vi của kEventHotKeyReleased
là:
Nói ví dụ tôi bấm tổ hợp phím Cmd-Shift-P. Ngay sau khi tôi thả phím "P", sự kiện phím nóng được kích hoạt. Tôi cần có khả năng kích hoạt sự kiện (hoặc kích hoạt sự kiện theo cách thủ công) khi tất cả của các phím không được nén (tức là: các phím Cmd và Shift cũng được giải phóng).
Thật dễ dàng để theo dõi các phím nóng nhưng tôi không thấy gì để theo dõi các lần nhấn phím cá nhân. Nếu tôi có thể theo dõi các phím bổ trợ, tôi sẽ làm việc.
Bất kỳ gợi ý nào về cách thực hiện việc này?
Cảm ơn trước!
UPDATE:
Tôi đã cố gắng sử dụng kEventRawKeyUp
và kEventRawKeyModifiersChanged
nhưng trong khi làm việc kEventHotKeyReleased
hai không mặc dù tôi thiết lập chúng theo cách chính xác giống như kEventHotKeyReleased
.
EventTypeSpec eventTypes[] = {{kEventClassKeyboard, kEventHotKeyReleased}, {kEventClassKeyboard, kEventRawKeyUp}};
// Changing the order in the list does not help, nor does removing kEventHotKeyReleased
OSStatus err = InstallApplicationEventHandler(&globalHotkeyHandler, GetEventTypeCount(eventTypes), eventTypes, NULL, NULL);
// err == noErr after this line
Phương pháp globalHotKeyHandler
được gọi là cho kEventHotKeyReleased
, nhưng không phải cho kEventRawKeyUp
đối với một số lý do tôi dường như không thể nắm bắt. Đây là những gì phương pháp globalHotKeyHandler
của tôi trông giống như:
OSStatus globalHotkeyHandler(EventHandlerCallRef nextHandler, EventRef anEvent, void *userData) {
NSLog(@"Something happened!");
}
Có một cuộc gọi bổ sung mà cần phải được thực hiện hay cái gì khác tôi quên?
N.B: Thoạt nhìn, có vẻ như Truy cập cho thiết bị trợ giúp bị tắt nhưng không phải là. Vì vậy, tôi khá không biết gì.
UPDATE 2:
tôi điều tra một chút trên CGEventTap
Leibowitzn đề nghị và tôi đã đưa ra với thiết lập này:
CFMachPortRef keyUpEventTap = CGEventTapCreate(kCGHIDEventTap,kCGHeadInsertEventTap,kCGEventTapOptionListenOnly,kCGEventKeyUp,&keyUpCallback,NULL);
CFRunLoopSourceRef keyUpRunLoopSourceRef = CFMachPortCreateRunLoopSource(NULL, keyUpEventTap, 0);
CFRelease(keyUpEventTap);
CFRunLoopAddSource(CFRunLoopGetCurrent(), keyUpRunLoopSourceRef, kCFRunLoopDefaultMode);
CFRelease(keyUpRunLoopSourceRef);
... và gọi lại:
CGEventRef keyUpCallback (CGEventTapProxy proxy, CGEventType type, CGEventRef event, void *refcon) {
NSLog(@"KeyUp event tapped!");
return event;
}
Như bạn có thể thấy tôi đang sử dụng kCGEventKeyUp
làm mặt nạ cho nhấn sự kiện nhưng bằng cách nào đó tôi nhận được sự kiện di chuột xuống ??! ??
UPDATE 3:
Ok quên rằng, tôi bỏ qua các dòng trong doc mà nói để sử dụng CGEventMaskBit (kCGEventKeyUp) cho tham số này, vì vậy cuộc gọi chính xác là:
CGEventTapCreate(kCGHIDEventTap,kCGHeadInsertEventTap,kCGEventTapOptionListenOnly,CGEventMaskBit(kCGEventKeyUp),&keyUpCallback,NULL);
Tôi vẫn gặp sự cố: các phím bổ trợ không kích hoạt kCGEventKeyUp ...
CẬP NHẬT 4:
Ok quên lần nữa ... Tôi sẽ trả lời câu hỏi của riêng tôi 5 phút sau khi yêu cầu họ ngay hôm nay huh!
Để chặn phím sửa đổi, sử dụng kCGEventFlagsChanged
:
CGEventTapCreate(kCGHIDEventTap,kCGHeadInsertEventTap,kCGEventTapOptionListenOnly,CGEventMaskBit(kCGEventFlagsChanged),&callbackFunction,NULL);
Vì vậy, trong bản chất tôi có chìa khóa và sửa đổi khóa làm việc phát hiện nhà nước, nhưng Tôi vẫn muốn biết lý do tại sao kEventRawKeyUp
không hoạt động ...
NB: Cũng lưu ý rằng tôi đang phát triển trên Tiger với mục tiêu hỗ trợ cho các phiên bản mới hơn và cũ hơn của HĐH Càng nhiều càng tốt. CGEventTap là 10.4+ chỉ vì vậy tôi sẽ sử dụng điều này cho đến bây giờ nhưng một giải pháp tương thích ngược sẽ được chào đón.
Tôi nghĩ có cách chỉ giám sát các phím bổ trợ. Kiểm tra mã nguồn vào Hộp Tìm kiếm Nhanh của Google. Nó có một số mã để phát hiện khi người dùng chạm vào phím lệnh hai lần. Xem: http://www.google.com/codesearch/p?hl=vi&sa=N&cd=2&ct=rc#qWBe9JkJhME/trunk/QuickSearchBox/QSB/QSBApplicationDelegate.m&q=modifiersChangedWhileInactive%20package:http://qsb-mac \ .googlecode \.com – Leibowitzn
Ahh, họ chỉ đăng ký sự kiện carbon sau: {kEventClassKeyboard, kEventRawKeyModifiersChanged} – Leibowitzn
Tôi đã nhận thấy kEventRawKeyModifiersChanged và kEventRawKeyUp nhưng tôi dường như không thể làm cho chúng hoạt động trong cuộc sống của tôi. Xem cập nhật trong câu hỏi của tôi. (Cảm ơn sự giúp đỡ của bạn btw!) – Form