Tôi đang sử dụng CGEventTapCreate
để "lấy cắp" các khóa phương tiện từ iTunes khi ứng dụng của tôi đang chạy. Mã bên trong của cuộc gọi lại mà tôi chuyển đến CGEventTapCreate
kiểm tra sự kiện và nếu phát hiện thấy đó là một trong các khóa phương tiện, hãy đăng thông báo thích hợp lên trung tâm thông báo mặc định.CGEventTapTạo vỡ xuống một cách bí ẩn với sự kiện "từ khóa"
Bây giờ, tính năng này hoạt động tốt nếu tôi đăng thông báo cho sự kiện "khóa". Nếu tôi làm điều đó cho các sự kiện "từ khóa", cuối cùng ứng dụng của tôi sẽ ngừng nhận các sự kiện quan trọng của phương tiện truyền thông và iTunes sẽ tiếp quản. Bất kỳ ý tưởng về những gì có thể gây ra điều này? Phần có liên quan của mã bên dưới là
enum {
...
PlayPauseKeyDown = 0x100A00,
PlayPauseKeyUp = 0x100B00,
...
};
static CGEventRef event_tap_callback(CGEventTapProxy proxy,
CGEventType type,
CGEventRef event,
void *refcon)
{
if (!(type == NX_SYSDEFINED) || (type == NX_KEYUP) || (type == NX_KEYDOWN))
return event;
NSEvent* keyEvent = [NSEvent eventWithCGEvent: event];
if (keyEvent.type != NSSystemDefined) return event;
switch(keyEvent.data1)
{
case PlayPauseKeyUp: // <--- this works reliably
//case PlayPauseKeyDown: // <--- this will break eventually
post_notification(@"PlayPauseMediaKeyPressed", nil, nil);
return NULL;
... and so on ...
Dường như là vấn đề về thời gian. Thay thế post_notification bởi giấc ngủ (1) và có nó, sau khi một vài phím nhấn iTunes đánh cắp các phím phương tiện truyền thông trở lại nếu tôi đang sử dụng PlayPauseKeyDown. Vẫn hoạt động nếu tôi đang sử dụng PlayPauseKeyUp. – svintus