Cả Brian và Daniel cung cấp manh mối tuyệt vời mà đã giúp tôi tìm ra câu trả lời đúng, nhưng những thứ mà họ đề nghị chỉ là một chút. Đây là cách tôi giải quyết vấn đề.
Brian đã đúng về mã để có được một mô tả của Apple tổ chức sự kiện cho một id quá trình thay vì một cho số serial:
// get the process id for the application that sent the current Apple Event
NSAppleEventDescriptor *appleEventDescriptor = [[NSAppleEventManager sharedAppleEventManager] currentAppleEvent];
NSAppleEventDescriptor* processSerialDescriptor = [appleEventDescriptor attributeDescriptorForKeyword:keyAddressAttr];
NSAppleEventDescriptor* pidDescriptor = [processSerialDescriptor coerceToDescriptorType:typeKernelProcessID];
Vấn đề là nếu bạn dành -int32Value
từ mô tả rằng, một giá trị của 0 được trả về (tức là không có id tiến trình.) Tôi không biết tại sao điều này xảy ra: theo lý thuyết, cả hai số pid_t
và SInt32
là các số nguyên đã ký.
Thay vào đó, bạn cần phải nhận được các giá trị byte (được lưu trữ little endian) và quăng vào một quá trình id:
pid_t pid = *(pid_t *)[[pidDescriptor data] bytes];
Từ thời điểm đó, nó đơn giản để có được thông tin về các tiến trình đang chạy:
NSRunningApplication *runningApplication = [NSRunningApplication runningApplicationWithProcessIdentifier:pid];
NSString *bundleIdentifer = [runningApplication bundleIdentifier];
Ngoài ra, đề xuất của Daniel về sử dụng keySenderPIDAttr
sẽ không hoạt động trong nhiều trường hợp. Trong thế giới sandboxed mới của chúng tôi, giá trị được lưu trữ ở đó có thể là id quá trình cho /usr/libexec/lsboxd
, còn được gọi là trình khởi chạy hộp cát Launch Services, không phải là id quá trình của ứng dụng khởi tạo sự kiện.
Cảm ơn Brian và Daniel vì đã giúp giải pháp này!
Hoặc bạn có thể sử dụng keySenderPIDAttr để nhận ngay tại PID mà không cần tra cứu người gửi và nén nó: [[event attributeDescriptorForKeyword: keySenderPIDAttr] int32Value] – danielpunkass