2009-11-21 27 views
5

Dưới đây là mã của tôi:OSX Quartz Event Taps: loại sự kiện và làm thế nào để chỉnh sửa sự kiện

#import <ApplicationServices/ApplicationServices.h> 

CGEventRef myCGEventCallback(CGEventTapProxy proxy, CGEventType type, CGEventRef event, void *refcon) { 
printf("%u\n", (uint32_t)type); 
return event; 
} 

int main (int argc, const char * argv[]) { 
CFMachPortRef eventTap; 
CFRunLoopSourceRef runLoopSource; 

eventTap = CGEventTapCreate(kCGSessionEventTap, kCGHeadInsertEventTap, 0, kCGEventMaskForAllEvents, myCGEventCallback, NULL); 
runLoopSource = CFMachPortCreateRunLoopSource(kCFAllocatorDefault, eventTap, 0); 
CFRunLoopAddSource(CFRunLoopGetCurrent(), runLoopSource, kCFRunLoopCommonModes); 
CGEventTapEnable(eventTap, true); 
CFRunLoopRun(); 
    return 0; 
} 

Đầu tiên .. những gì nếu tôi muốn chỉnh sửa sự kiện này? Ví dụ, tôi nghe cho sự kiện keyDown và nếu nó là "a", tôi chuyển nó thành "b" hoặc chỉnh sửa vị trí chuột trong thời gian thực hoặc chỉ cần chụp một sự kiện và làm cho nó không có hiệu lực (vô hiệu hóa một key ví dụ ..)

Thứ hai .. CGEventType được định nghĩa với một enum liệt kê chỉ một vài loại .. ví dụ khi tôi nhấn CMD tôi nhận được 12, nhưng không khớp với giá trị được chỉ định trong enum .. những gì tôi đang mất tích ??

+0

trả lời cũng bởi Dave DeLong ở đây: http://stackoverflow.com/questions/5785630/modify-nsevent-to -send-a-khác-key-hơn-the-one-that-was-pressed/5785895 # 5785895 – cksubs

Trả lời

2

Để sửa đổi sự kiện, có nhiều hàm CGEventSet ... khác nhau. Để giết sự kiện, tôi nghĩ rằng chức năng vòi của bạn chỉ có thể trả về NULL.

Việc liệt kê các loại sự kiện bao gồm kCGEventFlagsChanged = NX_FLAGSCHANGED. Nếu bạn nhìn lên IOKit/hidsystem/IOLLEvent.h, nó định nghĩa NX_FLAGSCHANGED là 12.

Các vấn đề liên quan